使用這樣的函數(shù):#include <stdio.h>#include <stdlib.h>#include <sys/wait.h>#include <unistd.h>void print_trace() { char pid_buf[30]; sprintf(pid_buf, "--pid=%d", getpid()); char name_buf[512]; name_buf[readlink("/proc/self/exe", name_buf, 511)]=0; int child_pid = fork(); if (!child_pid) { dup2(2,1); // redirect output to stderr fprintf(stdout,"stack trace for %s pid=%s\n",name_buf,pid_buf); execlp("gdb", "gdb", "--batch", "-n", "-ex", "thread", "-ex", "bt", name_buf, pid_buf, NULL); abort(); /* If gdb failed to start */ } else { waitpid(child_pid,NULL,0); }}我在輸出中看到了print_trace的詳細(xì)信息。還有什么其他方法可以做到呢?
3 回答

HUWWW
TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個贊
如果您使用的是Linux,則標(biāo)準(zhǔn)C庫包括一個名為的函數(shù)backtrace,該函數(shù)用幀的返回地址填充一個數(shù)組,以及另一個名為的函數(shù)backtrace_symbols,該函數(shù)將從中獲取地址backtrace并查找相應(yīng)的函數(shù)名。這些記錄在GNU C庫手冊中。
這些不會顯示參數(shù)值,源代碼行等,它們僅適用于調(diào)用線程。但是,它們應(yīng)該比以這種方式運(yùn)行GDB快得多(也許不那么松懈),因此它們有自己的位置。
添加回答
舉報(bào)
0/150
提交
取消