在Linux程序中输出函数调用栈
程序發(fā)生異常時(shí),將函數(shù)的調(diào)用棧打印出來(lái),可以大大提高定位效率。
Linux中提供了三個(gè)函數(shù)用來(lái)獲取調(diào)用棧:
/*?獲取函數(shù)調(diào)用棧?*/ int?backtrace(void?**buffer,?int?size);/*?將調(diào)用棧中的函數(shù)地址轉(zhuǎn)化為函數(shù)名稱(chēng)?并返回一個(gè)字符串?dāng)?shù)組?*/ char?**backtrace_symbols(void?*const?*buffer,?int?size);/*?將調(diào)用棧中的函數(shù)地址轉(zhuǎn)化為函數(shù)名稱(chēng)?并將其定入到文件中?*/ void?backtrace_symbols_fd(void?*const?*buffer,?int?size,?int?fd);示例代碼:
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
/* 打印調(diào)用棧的最大深度 */
#define DUMP_STACK_DEPTH_MAX 16
/* 打印調(diào)用棧函數(shù) */
void dump_trace() {
? ? void *stack_trace[DUMP_STACK_DEPTH_MAX] = {0};
? ? char **stack_strings = NULL;
? ? int stack_depth = 0;
? ? int i = 0;
? ? /* 獲取棧中各層調(diào)用函數(shù)地址 */
? ? stack_depth = backtrace(stack_trace, DUMP_STACK_DEPTH_MAX);
? ? /* 查找符號(hào)表將函數(shù)調(diào)用地址轉(zhuǎn)換為函數(shù)名稱(chēng) */
? ? stack_strings = (char **)backtrace_symbols(stack_trace, stack_depth);
? ? if (NULL == stack_strings) {
? ? ? ? printf(" Memory is not enough while dump Stack Trace! \r\n");
? ? ? ? return;
? ? }
? ? /* 打印調(diào)用棧 */
? ? printf(" Stack Trace: \r\n");
? ? for (i = 0; i < stack_depth; ++i) {
? ? ? ? printf(" [%d] %s \r\n", i, stack_strings[i]);
? ? }
? ? /* 獲取函數(shù)名稱(chēng)時(shí)申請(qǐng)的內(nèi)存需要自行釋放 */
? ? free(stack_strings);
? ? stack_strings = NULL;
? ? return;
}
/* 測(cè)試函數(shù) 2 */
void test_meloner() {
? ? dump_trace();
? ? return;
}
/* 測(cè)試函數(shù) 1 */
void test_hutaow() {
? ? test_meloner();
? ? return;
}
/* 主函數(shù) */
int main(int argc, char *argv[]) {
? ? test_hutaow();
? ? return 0;
}
源文件下載:鏈接
編譯時(shí)需要加上-rdynamic參數(shù),以得到符號(hào)名稱(chēng),像下面這樣:
gcc?-rdynamic?backtrace.c?-o?backtrace執(zhí)行./backtrace運(yùn)行程序,輸出如下:
轉(zhuǎn)載于:https://blog.51cto.com/jeff1573/1665062
總結(jié)
以上是生活随笔為你收集整理的在Linux程序中输出函数调用栈的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: centos 7挂载windows共享目
- 下一篇: Linux下防御/减轻DDOS***的方