0

Was ist der richtige Weg, eine unbekannte unbehandelte Ausnahme in Microsoft Visual Studio C++ (natives C++, Visual Studio 2015) zu debuggen.
Heute habe ich die Ausnahmen (: Exception thrown: read access violation. this was 0x4. der Text): erhaltenRichtiger Weg zum Debuggen unbehandelter Ausnahme in MS Visual C++

enter image description here

Der Code, was nach dem Drücken der "Break" Knopf angezeigt wird, ist nur ein Code von Standard Qt framework Header qscopedpointer.h:

Jetzt habe ich keine Ahnung, was der Grund für dieses Problem ist. Gewöhnlich war es kein Problem, aber ich habe das Projekt ausgeführt, das in VS 2012 immer richtig lief, und jetzt bin ich mir nicht einmal sicher, ob das ein echter Fehler ist oder ich muss nur den "Break wenn dieser Ausnahmetyp ausgelöst wird" .

Ich kann nicht "Step out" von dem Punkt, und suche der Call-Stack nicht gibt auch Verständnis für die Frage:
enter image description here

den Text:

Qt5Cored.dll!QScopedPointer<QObjectData,QScopedPointerDeleter<QObjectData> >::data() Line 135 C++ 
    Qt5Cored.dll!qGetPtrHelper<QScopedPointer<QObjectData,QScopedPointerDeleter<QObjectData> > >(const QScopedPointer<QObjectData,QScopedPointerDeleter<QObjectData> > & p) Line 1014 C++ 
    Qt5Cored.dll!QWinOverlappedIoNotifier::d_func() Line 60 C++ 
    Qt5Cored.dll!QWinOverlappedIoNotifier::waitForAnyNotified(int msecs=1) Line 358 C++ 
    Qt5SerialPortd.dll!QSerialPortPrivate::waitForNotified(int msecs=1) Line 588 C++ 
    Qt5SerialPortd.dll!QSerialPortPrivate::waitForReadyRead(int msecs=1) Line 251 C++ 
    Qt5SerialPortd.dll!QSerialPort::waitForReadyRead(int msecs=1) Line 1309 C++ 
    MyProject.exe!UsualSep::send_cmd_and_receive_answer(const QByteArray & ba={...}, QByteArray & ans={...}, int nread=2) Line 797 C++ 
    MyProject.exe!UsualSep::isAvailable(bool & avbl=false) Line 204 C++ 
    MyProject.exe!UsualSep::on_workThread_started() Line 80 C++ 
    MyProject.exe!QtPrivate::FunctorCall<QtPrivate::IndexesList<>,QtPrivate::List<>,void,void (__thiscall UsualSep::*)(void)>::call(void(UsualSep::*)() f=0x00eb172b, UsualSep * o=0x007838d8, void * * arg=0x02bff91c) Line 501 C++ 
    MyProject.exe!QtPrivate::FunctionPointer<void (__thiscall UsualSep::*)(void)>::call<QtPrivate::List<>,void>(void(UsualSep::*)() f=0x00eb172b, UsualSep * o=0x007838d8, void * * arg=0x02bff91c) Line 520 C++ 
    MyProject.exe!QtPrivate::QSlotObject<void (__thiscall UsualSep::*)(void),QtPrivate::List<>,void>::impl(int which=1, QtPrivate::QSlotObjectBase * this_=0x029ee9d8, QObject * r=0x007838d8, void * * a=0x02bff91c, bool * ret=0x00000000) Line 143 C++ 
    Qt5Cored.dll!QtPrivate::QSlotObjectBase::call(QObject * r=0x007838d8, void * * a=0x02bff91c) Line 124 C++ 
    Qt5Cored.dll!QMetaObject::activate(QObject * sender=0x029ee9a0, int signalOffset=3, int local_signal_index=0, void * * argv=0x00000000) Line 3720 C++ 
    Qt5Cored.dll!QMetaObject::activate(QObject * sender=0x029ee9a0, const QMetaObject * m=0x670e5db0, int local_signal_index=0, void * * argv=0x00000000) Line 3595 C++ 
    Qt5Cored.dll!QThread::started(QThread::QPrivateSignal __formal={...}) Line 156 C++ 
    Qt5Cored.dll!QThreadPrivate::start(void * arg=0x029ee9a0) Line 384 C++ 
    ucrtbased.dll!774f8968() Unknown 
    [Frames below may be incorrect and/or missing, no symbols loaded for ucrtbased.dll] 
    ucrtbased.dll!774f867b() Unknown 
    kernel32.dll!74fc336a() Unknown 
    ntdll.dll!77169902() Unknown 
    ntdll.dll!771698d5() Unknown 

Und meine Hauptfrage ist, nicht darüber, was in diesem speziellen Fall zu tun ist, aber was ist der allgemeine Weg, solche Ausnahmen zu debuggen.

+0

Das d ist zu diesem Zeitpunkt ungültig. Sie sollten den StackTrace einchecken, wo er in Ihrem Programm aufgerufen wird und warum er zu diesem Zeitpunkt ungültig ist. Ich empfehle dringend, dieses Problem zu bewerten und nicht zu ignorieren. – Simon

Antwort

2

Wenn die Ausnahme einen Handler irgendwo in den Call-Stack hat es könnte ok sei es unabhängig weiter zu lassen. Achten Sie jedoch darauf, dass Sie verstehen, was vor sich geht.

Wenn der Aufruf-Stack auf Ihren Code zeigt, starten Sie dort. Ich vermute, in diesem Fall, "MyProject.exe! UsualSep :: send_cmd_and_receive_answer ..." Wie versucht dies am Ende, die Daten d zu bekommen? Denken Sie das hier?

Meine allgemeine Vorgehensweise wäre, zu versuchen, das Problem auf eine kleine unabhängige Funktion einzugrenzen und es in einem Test zu verpacken, den Sie automatisch ausführen können, der das Problem wiederholt. Dann versuche es zu beheben. Vielleicht müssen Sie versuchen, isNull irgendwo in Ihrem Code zu überprüfen?

1

Wenn Sie "brechen, wenn dieser Ausnahmetyp ausgelöst wird", würde ich raten, dass beim nächsten Debuglauf der Debugger an dem Punkt geöffnet wird, an dem die Ausnahme ausgelöst wird, was Ihnen möglicherweise das Problem erklärt.

Wenn Sie die Ausnahme behandeln, ist es natürlich nicht länger ein Fehler. Sie können mit einigen Schwierigkeiten debuggen, indem Sie die Exception in einem try-Block in main behandeln und dann nach unten bohren, um genau herauszufinden, welcher Teil des Programms sie auslöst.

Es könnte einen Fehler in Qt und nicht in Ihrem eigenen Code geben. Wenn das der Fall ist, ist es wahrscheinlich etwas ziemlich Unklares - Qt wird für den allgemeinsten Gebrauch in der realen Welt getestet - aber es wird schwer zu finden sein. Der Stack-Trace weist jedoch darauf hin, dass Ihre Funktion send_cmd_and_receive_answer() fehlerhaft ist. Am wahrscheinlichsten ruft es Qt mit Speicher auf, den es nicht besitzt, oder mit anderen Worten, es einen wilden Zeiger passierend.

Verwandte Themen