Problem with disassembler and SIGILL signal
-
@mrjj
Well right now you're talking to me in japanese ^^
I'm going to have a look on that didn't had time yesterday , I think I can be helped for one thing or two :)
I'll come back if my problem is solve or not.Oh :) sorry.
What i mean is SIGILL means "what the hell is that instruction" from the cpu.
This can happen if compiler setting is slightly off for target.
OR
you can also have it happen if you write over the end of an array
or use a pointer that is not set.
Like
MyClass *c1; /// dangling pointer
c1->somfunc()
Then when CPU tries to run the func it sees some random garbage at that location
and might say SIGILL. -
wrote on 21 Dec 2016, 08:56 last edited by
Alright that's clearer ^^
So if I need to create a dangling pointer where do I need to declare it ?
into the class itself ? -
Alright that's clearer ^^
So if I need to create a dangling pointer where do I need to declare it ?
into the class itself ?@Amaury
Well you can declare it anywhere. :)
You want to try crash on purpose`? -
wrote on 21 Dec 2016, 09:09 last edited by
Yes I'd like to look at all my pointers, see if there's somewhere that one is not declared or thing like that.
-
Yes I'd like to look at all my pointers, see if there's somewhere that one is not declared or thing like that.
- one is not declared
I assume you mean instantiated or in non japanese
new'ed
as in
ClassX * varX = new X()
- one is not declared
-
wrote on 21 Dec 2016, 10:06 last edited by Amaury
Yes that's alright .
Btw I got a question , there's some code that I didn't develop myself and I was wondering if there could be an error in some parameters here's the setup :
main.cpp
static const QString path = "localhost"; DataBase MemTampon::Db(path); int main(int argc, char *argv[]) { QApplication a(argc, argv); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); QTranslator *qtTranslator = new QTranslator; qtTranslator->load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); a.installTranslator(qtTranslator); MemTampon::Db.aff_Temperature(); MemTampon::Db.aff_Humidite(); MemTampon::Db.aff_Puissance(); MemTampon::Db.aff_Nom_SD(); MainWindow w; w.show(); return a.exec(); }
memtampon.h (memtampon.cpp is empty)
class MemTampon { public: static DataBase Db; static Options Opt; };
and Database.cpp
DataBase::DataBase(const QString &path) { db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("SmartDevice_DB_V1"); db.setUserName("root"); db.setPassword("root"); if (!db.open()) { qDebug() << "Error: connection with database fail"; } else { qDebug() << "Database: connection ok"; } }
I assume that with the path variable I am able to call the functions that are in my cpp but, it tells me that path is an unused parameter could it possibly give me an error ?
-
Its impossible to say
But global variables are good candidate to be check. (always)I dont think
static const QString path;
can give such error. -
wrote on 21 Dec 2016, 10:32 last edited by
Thank you I was a little disapointed by this function and wasn't able to say if that was correct or not
-
Thank you I was a little disapointed by this function and wasn't able to say if that was correct or not
@Amaury
Well you can always single step it and see if something happens. -
Thank you I was a little disapointed by this function and wasn't able to say if that was correct or not
@Amaury
Also you can cut the code that you suspect and see if the problem manifest itself. I wouldn't in principle initialize anything outside of main (like your database) if I can help it, that way I stumble on to less errors in my code, and thus makes for an easier time debugging. Still, my best guess is there some subtle architecture mismatch, so the compiler generates a mostly valid code. However I have no clue how to really test that at present. -
wrote on 21 Dec 2016, 11:08 last edited by Amaury
By using step I can't see any bugs so that's not here.
By the way I'm using the memory check Valgind through QT and when I do a memory check thats starting but I got this message after a few seconds :
Analyzing memory of /home/pi/Desktop/SmartDevice/SauvegardeRASPI/New/build-SmartDevice_QT_V11-Desktop-Debug/SmartDevice_QT_V11 <frame> <ip>0x485F6F0</ip> <obj>/usr/lib/arm-linux-gnueabihf/libarmmem.so</obj> </frame> </stack> Analyzing finished. ** Unknown error **
I followed the steps here :
http://doc.qt.io/qtcreator/creator-valgrind-overview.html
http://doc.qt.io/qtcreator/creator-analyzer.html -
wrote on 21 Dec 2016, 11:15 last edited by
@kshegunov
If I don't declare it there where could I do it ? As said before that's not a code that I did myself and I don't really understand the way that it works (how the "path" is used thorugh the different pages ... -
@kshegunov
If I don't declare it there where could I do it ? As said before that's not a code that I did myself and I don't really understand the way that it works (how the "path" is used thorugh the different pages ...@Amaury said in Problem with disassembler and SIGILL signal:
If I don't declare it there where could I do it
From the looks of it you can safely put the
db
initialization in main (after you've created the application object). As for the string, it's okay to leave it as a global. -
wrote on 21 Dec 2016, 11:43 last edited by Amaury
I tried like that but that doesn't work got a qualified-id in declaration before '(' token error
static const QString path = "localhost"; int main(int argc, char *argv[]) { QApplication a(argc, argv); DataBase MemTampon::Db(path); . . . }
Even with the string inside the main ...
-
I tried like that but that doesn't work got a qualified-id in declaration before '(' token error
static const QString path = "localhost"; int main(int argc, char *argv[]) { QApplication a(argc, argv); DataBase MemTampon::Db(path); . . . }
Even with the string inside the main ...
It should be:
DataBase Db(path);
You're not initializing a static anymore.
-
wrote on 21 Dec 2016, 13:08 last edited by Amaury
The problem is if I don't use a static I can't do the calls for my other functions in my Database class..
const QString path = "localhost"; int main(int argc, char *argv[]) { QApplication a(argc, argv); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); QTranslator *qtTranslator = new QTranslator; qtTranslator->load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); a.installTranslator(qtTranslator); DataBase Db(path); DataBase::Db.aff_Temperature(); DataBase::Db.aff_Humidite(); DataBase::Db.aff_Puissance(); DataBase::Db.aff_Nom_SD(); MainWindow w; w.show(); return a.exec(); }
(By the way I've delete the MemTampon that I agree was useless ... )
EDIT : My bad I'm dumb I think ^^ for the main it's alright just had to cut out the "DataBase::"
But I'm doing reference to the "Db" inside another page but the call doesn't work...
if (Db.isOpen()) { Temp = Db.aff_Temperature(); Humid = Db.aff_Humidite(); Puiss = Db.aff_Puissance(); Nom = Db.aff_Nom_SD(); Axe_X = Db.aff_AxeX(); Axe_Y = Db.aff_AxeY(); Axe_Z = Db.aff_AxeZ();
-
The problem is if I don't use a static I can't do the calls for my other functions in my Database class..
const QString path = "localhost"; int main(int argc, char *argv[]) { QApplication a(argc, argv); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); QTranslator *qtTranslator = new QTranslator; qtTranslator->load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); a.installTranslator(qtTranslator); DataBase Db(path); DataBase::Db.aff_Temperature(); DataBase::Db.aff_Humidite(); DataBase::Db.aff_Puissance(); DataBase::Db.aff_Nom_SD(); MainWindow w; w.show(); return a.exec(); }
(By the way I've delete the MemTampon that I agree was useless ... )
EDIT : My bad I'm dumb I think ^^ for the main it's alright just had to cut out the "DataBase::"
But I'm doing reference to the "Db" inside another page but the call doesn't work...
if (Db.isOpen()) { Temp = Db.aff_Temperature(); Humid = Db.aff_Humidite(); Puiss = Db.aff_Puissance(); Nom = Db.aff_Nom_SD(); Axe_X = Db.aff_AxeX(); Axe_Y = Db.aff_AxeY(); Axe_Z = Db.aff_AxeZ();
@Amaury said in Problem with disassembler and SIGILL signal:
if I don't use a static I can't do the calls for my other functions in my Database class..
Why not, you can always get the opened database (it's default named) by calling
QSqlDatabase db = QSqlDatabase::database()
. TheQSqlDatabase
class already keeps track of the opened connections for you. -
wrote on 21 Dec 2016, 13:28 last edited by Amaury
So what you mean is that for now my function
Database Db(path)
is just to specify if the connection is opened or not ? -
So what you mean is that for now my function
Database Db(path)
is just to specify if the connection is opened or not ?@Amaury
Eh, yes I suppose you could say that, currently in the constructor of your object you open the database:db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); // ...
so it serves as database initialization. You can do that in
main()
too, but that's another point. After the constructor's run, you can get the opened database the way I mentioned in my previous post. In principle it's not really needed to have a "database manager" with Qt, because theQSqlDatabase
class already keeps track of the connections, as mentioned. You can look up the two functionsQSqlDatabase::addDatabase
andQSqlDatabase::database
in the docs and I think it'll become clear from the examples there. -
wrote on 21 Dec 2016, 13:52 last edited by
Alright I'm going to check and change some things to see if that deletes the Sigill signal (hope so) I come back to give you feedback.
Thanks !
48/59