linux下追蹤函式呼叫堆疊backtrace
程式在得到一個Segmentation fault這樣的錯誤資訊毫無保留地就跳出來了,遇到這樣的問題讓人很痛苦,查詢問題不亞於你N多天辛苦勞累編寫程式碼的難度。那麼有沒有更好的方法可以在產生SIGSEGV訊號的時候得到除錯可用的資訊呢?看看下面的例程吧!
sigsegv.c
下面來編譯上面的main.c程式看看將會產生什麼樣的資訊呢,不過要注意的就是如果要在你的程式裡引用sigsegv.h、sigsegv.c得到堆疊資訊的話記得加上-rdynamic -ldl引數。 /data/codes/c/test/backtraces $ gcc -o test -rdynamic -ldl -ggdb -g sigsegv.c main.c 下面用gdb來看看出錯的地方左右的程式碼: /data/codes/c/test/backtraces $ gdb ./test 也可以直接break *die+16進行除錯,看看在出錯之前的堆疊情況,那麼下面我們再來看看程式碼問題到底出在什麼地方了。 /data/codes/c/test/backtraces $ gdb ./test 現在看看定位錯誤將會多麼方便,上面的除錯指令中list之前break不是必須的,只是讓你可以看到break其實就已經指出了哪一行程式碼導致 Segmentation fault了。如果你要釋出你的程式你一般會為了減少體積不會附帶除錯資訊的(也就是不加-ggdb -g引數),不過沒關係,你一樣可以得到上面stack-trace資訊,然後你除錯之前只要加上除錯資訊即可。 |