Linux 獲取並分析程式崩潰時的呼叫堆疊

2021-08-20 18:50:06 字數 1690 閱讀 5371

下面是乙個小例子,說明了程式出現段錯誤時,如何列印程式的堆疊資訊。

[cpp] 

view plain

copy

#include

#include

#include

#include 

static

void

widebrightsegvhandler(

intsignum)  

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)  

intmain()   

然後為了定位錯誤,我們需要加上-g引數編譯乙個帶除錯資訊的版本,程式執行後列印堆疊資訊如下

[cpp] 

view plain

copy

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 獲取並分析程式崩潰時的呼叫堆疊

下面是乙個小例子,說明了程式出現段錯誤時,如何列印程式的堆疊資訊。include include include include static void widebrightsegvhandler int signum free strings exit 1 int invalide pointer...

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...