linux下C應(yīng)用程序打印調(diào)用棧

使用GCC編譯的C應(yīng)用程序,如果想在某個(gè)接口中打印調(diào)用棧,可以使用gcc的backtraces特性

Backtraces說(shuō)明中有一個(gè)例子,代碼如下:

#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>

/* Obtain a backtrace and print it to stdout. */
void
print_trace (void)
{
  void *array[10];
  char **strings;
  int size, i;

  size = backtrace (array, 10);
  strings = backtrace_symbols (array, size);
  if (strings != NULL)
  {

    printf ("Obtained %d stack frames.\n", size);
    for (i = 0; i < size; i++)
      printf ("%s\n", strings[i]);
  }

  free (strings);
}

/* A dummy function to make the backtrace more interesting. */
void
dummy_function (void)
{
  print_trace ();
}

int
main (void)
{
  dummy_function ();
  return 0;
}

直接通過(guò)gcc來(lái)編譯運(yùn)行,結(jié)果如下:

itsenlin@itsenlin-virtual-machine:~/code/test$ gcc -o backtr backtr.c
itsenlin@itsenlin-virtual-machine:~/code/test$ ./backtr
Obtained 6 stack frames.
./backtr(+0x1215) [0x559a1a0b2215]
./backtr(+0x12b1) [0x559a1a0b22b1]
./backtr(+0x12c1) [0x559a1a0b22c1]
/lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7f779d629d90]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7f779d629e40]
./backtr(+0x1125) [0x559a1a0b2125]
itsenlin@itsenlin-virtual-machine:~/code/test$

如果想顯示函數(shù)名,還需要在編譯時(shí)添加-rdynamic選項(xiàng),如下

itsenlin@itsenlin-virtual-machine:~/code/test$ gcc -o backtr backtr.c -rdynamic
itsenlin@itsenlin-virtual-machine:~/code/test$ ./backtr
Obtained 6 stack frames.
./backtr(print_trace+0x2c) [0x560984d66215]
./backtr(dummy_function+0xd) [0x560984d662b1]
./backtr(main+0xd) [0x560984d662c1]
/lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7f860a029d90]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7f860a029e40]
./backtr(_start+0x25) [0x560984d66125]
itsenlin@itsenlin-virtual-machine:~/code/test$ vim backtr.c
itsenlin@itsenlin-virtual-machine:~/code/test$
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容