因此,我現在遇到了一個奇怪的錯誤,現在我正在尋找一些好的方向來識別問題。識別導致內存錯誤的變量
基本上我所看到的是seg-fault。症狀如下:
- 它只發生在程序處於發佈模式而不是調試時。
它顯示爲段錯誤,GDB告訴我它在函數結束時位於
_list_release
/_free()
/free()
。Program received signal SIGSEGV, Segmentation fault.
0xb0328af8 in _list_release() from /usr/qnx650/target/qnx6/x86/lib/libc.so.3
(gdb) bt
0 0xb0328af8 in _list_release() from /usr/qnx650/target/qnx6/x86/lib/libc.so.3
1 0xb032a464 in __free() from /usr/qnx650/target/qnx6/x86/lib/libc.so.3
2 0xb0329f7d in free() from /usr/qnx650/target/qnx6/x86/lib/libc.so.3
我沒有使用任何動態內存(可能會出現在Eigen(或其他庫)中的內容除外)
- 我可以在函數結束之前打印所有局部變量,所以它不是雙倍空閒的。
最後一次發生這是一個內存故障,它適合所有這些問題。令人討厭的是,這次我找不到問題。
我想要做的是以下幾點:
- 這將是額外的有用:我如何可以強制在調試模式下此錯誤,那麼GDB會的方式更有幫助。
- 什麼是最好的方式來追查什麼小bug is導致問題。 注:我不能Valgrind的使用,它沒有操作系統,我使用(QNX)
任何幫助將是巨大的工作。
'我可以在函數結束之前打印所有局部變量,所以它不是雙重空閒.'雙重空閒是未定義的行爲,所以這不一定是真實的。 – chris
@chris好吧,那麼我會如何測試? –
那麼,避免這些問題的最好方法是使用RAII等來防止許多導致段錯誤的常見原因。總有Clang的catch-undefined-行爲的事情,這可能會有所幫助。 – chris