讓 C 程式當掉時,印出 crash backstrace

在 Linux 開發 kernel module 時,若發生不正常存取 (當掉),一般都可以印出 call trace,可以知道 function 的呼叫流程,最後死在哪個 function 裡。但這麼好用的功能在一般的 C 程式裡,確沒有!?

於是幾年前上網搜了一下怎麼讓一般程式當掉時也會印出來 call trace,還真的可以達到這個功能。但實際在工作上使用時,當掉好像也沒看到印出東西來。但範例是可以用的,就把這古老的回憶留給需要的人了。

這個也可以把它當做 kernel 裡的 dump_stack() 來用,看看是從哪邊呼叫到目前 function 的。

範例程式碼

編譯與測試

x86 環境

gcc -rdynamic a.c

ARM 環境

$(CROSS)gcc -funwind-tables -fasynchronous-unbind-tables a.c

執行結果

程式最後是當在 func_c() 裡面,而呼叫的流程也正確的印了出來 main() –> func_a() –> func_b() –> func_c() –> crash

 

Leave a Reply