在 Linux 系統中,獲取完整的堆棧跟蹤可以幫助你定位程序中的錯誤或異常。你可以使用 backtrace()
或 backtrace_symbols()
函數來獲取堆棧跟蹤,然后使用 addr2line()
函數將地址轉換為對應的源代碼行。
以下是一個簡單的示例,說明如何獲取完整的堆棧跟蹤:
-g
選項編譯你的程序,例如:gcc -g my_program.c -o my_program
<execinfo.h>
頭文件,并使用 backtrace()
或 backtrace_symbols()
函數獲取堆棧跟蹤。例如:#include <stdio.h>
#include <execinfo.h>
#include <unistd.h>
void print_backtrace() {
void *array[100];
size_t size;
// 獲取堆棧跟蹤
size = backtrace(array, 100);
// 打印堆棧跟蹤
printf("Error: signal %d:\n", errno);
backtrace_symbols_fd(array, size, STDERR_FILENO);
}
int main() {
print_backtrace();
return 0;
}
./my_program
addr2line()
函數。首先,你需要安裝 binutils
軟件包(如果尚未安裝):sudo apt-get install binutils
addr2line()
函數將堆棧跟蹤中的地址轉換為對應的源代碼行。例如:addr2line -f -e my_program < /proc/<pid>/stack | tail
其中,<pid>
是你的程序進程的 ID。這將顯示堆棧跟蹤中最后幾個函數的源代碼行。
通過這些步驟,你應該能夠獲取并查看完整的堆棧跟蹤,從而更容易地找到程序中的錯誤或異常。