0

在Microsoft Visual Studio C++(native C++,Visual Studio 2015)中調試未知的未處理異常的正確方法是什麼?
今天我收到了異常(文:Exception thrown: read access violation. this was 0x4.):在MS Visual C++中調試未處理的異常的正確方法

enter image description here

什麼是按後顯示的「破發」按鈕的代碼是距離標準Qt frameworkqscopedpointer.h代碼:

enter image description here

現在我不知道這個問題的原因是什麼。通常這是沒有問題的,但是知道我已經運行了在VS 2012中始終正確運行的項目,現在我甚至不確定這是一個真正的錯誤,還是我只需要取消選中「拋出此異常類型時拋出」 。

我不能從點「走出」,並尋找調用堆棧也沒有給出對問題的理解:
enter image description here

文:

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 

我的主要問題是而不是在這種特殊情況下做什麼,但什麼是調試這種例外的一般方法

+0

此時d無效。你應該檢查堆棧跟蹤程序中它被調用的地方以及爲什麼它在這個時候是無效的。我強烈建議評估這個問題,不要忽視它。 – Simon

回答

2

如果異常有一個處理程序某處調用堆棧它可能是確定讓它繼續不分。但是,請務必確保您瞭解正在發生的事情。

如果調用堆棧指向您的代碼,請從此處開始。我認爲,在這種情況下,「MyProject.exe!UsualSep :: send_cmd_and_receive_answer ...」這是如何結束試圖獲取數據d?你認爲你在這裏設置?

我的一般方法是嘗試將問題縮小爲小型自包含函數,並將其包裝在可以自動運行的測試中,這會重複出現問題。然後嘗試修復它。也許你需要嘗試isNull作爲你的代碼中的一個檢查?

1

如果你檢查「break when this exception type is thrown」,那麼我猜測在下一次調試運行時,你會在拋出異常的時候打開調試器,這很可能會告訴你這個問題。

如果你處理異常當然它不再是一個錯誤。您可以通過在main中的try塊中處理異常來進行調試,然後進行深入研究,以確定程序的哪一部分將其拋出。

在Qt中可能存在一個錯誤,而不是你自己的代碼。如果是這樣,它可能會是一個很模糊的東西 - Qt是測試大多數一般的真實世界使用 - 但它很難找到。但是堆棧跟蹤表明你的函數send_cmd_and_receive_answer()有問題。最有可能的是它調用Qt與它不擁有的內存,或者換句話說它傳遞一個野指針。

相關問題