下面是乙個小例子,說明了程式出現段錯誤時,如何列印程式的堆疊資訊。
#include#include#include#include static void widebrightsegvhandler(int signum)
free (strings);
exit(1);
}int invalide_pointer_error(char * p)
void error_2(char * p)
void error_1(char * p)
void error_0(char * p)
int main()
然後為了定位錯誤,我們需要加上-g引數編譯乙個帶除錯資訊的版本,程式執行後列印堆疊資訊如下widebright received sigsegv! stack trace:
0 ./a.out [0x8048580]
1 [0xb7fb3400]
2 ./a.out [0x8048636]
3 ./a.out [0x8048649]
4 ./a.out [0x804865c]
5 ./a.out [0x80486a9]
6 /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5) [0xb7e52775]
7 ./a.out [0x80484c1]
使用gdb除錯工具定位和除錯錯誤。
info line *0x8048580 列印位址0x8048580處的相關資訊。
list *0x8048580 獲取位址0x8048580相關的上下文**資訊。
然後便可以確定行號,進行gdb除錯了。
使用gcc編譯選項生成map檔案查詢位址對應的函式資訊。
使用gcc編譯選項生成map檔案查詢位址對應的函式資訊。在通過gcc/g++間接呼叫鏈結程式ld時,所有的ld選項前必須加上「-wl,」,因為-map是ld的選項。所以,要讓g++生成mapfile,需要增加編譯引數「 -wl,-map,mapfile」。
例:gcc -o helloworld helloworld.c -wl,-map,helloworld.map
然後通過map檔案來檢視函式的位址和函式名的對應關係了。
使用 addr2line 將函式位址解析為函式名。
addr2line 工具(它是標準的 gnu binutils 中的一部分)是乙個可以將指令的位址和可執行映像轉換成檔名、函式名和源**行數的工具。這種功能對於將跟蹤位址轉換成更有意義的內容來說簡直是太棒了。
注意編譯程式時需要新增-g選項才可以,也可以新增-wl 和-map選項。
在呼叫 addr2line 工具時,要使用 -e 選項來指定可執行映像是 test。通過使用 -f 選項,可以告訴工具輸出函式名。
例如:addr2line 0x08048258 -e test -f
Linux 獲取並分析程式崩潰時的呼叫堆疊
下面是乙個小例子,說明了程式出現段錯誤時,如何列印程式的堆疊資訊。cpp view plain copy include include include include static void widebrightsegvhandler intsignum free strings exit 1 i...
python程式異常崩潰時如何快速分析並解決問題
程式異常崩潰時會提供非常詳細的錯誤資訊,掌握正確的分析方法,就可以快速定位問題並解決問題,下面這段 會引發異常導致程式終止 def func tet func sum 4 3 def func sum a,b value a b return value func tet 執行這段程式,異常資訊如下...
linux下監控程式並崩潰重啟
if test pgrep f 1 wc l eq 0 then echo 程序不存在 else echo 存在程序 fi執行 crontab e 裡面輸入 1 bin bash home automonitor.sh 代表一分鐘執行一次指令碼 bin sh serverpid ps aux gre...