Tôi đang cố gắng in backtrace khi chương trình C++ của tôi chấm dứt. Chức năng in ấn backtrace là như dưới đây;Cách lấy backtrace chi tiết hơn
void print_backtrace(void){
void *tracePtrs[10];
size_t count;
count = backtrace(tracePtrs, 10);
char** funcNames = backtrace_symbols(tracePtrs, count);
for (int i = 0; i < count; i++)
syslog(LOG_INFO,"%s\n", funcNames[i]);
free(funcNames);
}
Nó cung cấp kết quả như;
desktop program: Received SIGSEGV signal, last error is : Success
desktop program: ./program() [0x422225]
desktop program: ./program() [0x422371]
desktop program: /lib/libc.so.6(+0x33af0) [0x7f0710f75af0]
desktop program: /lib/libc.so.6(+0x12a08e) [0x7f071106c08e]
desktop program: ./program() [0x428895]
desktop program: /lib/libc.so.6(__libc_start_main+0xfd) [0x7f0710f60c4d]
desktop program: ./program() [0x4082c9]
Có cách nào để có được backtrace chi tiết hơn với các tên hàm và dòng, như đầu ra gdb không?
Bạn đã cài đặt bản cài đặt gỡ lỗi chưa? IIRC Linux sẽ sử dụng một libc với các biểu tượng gỡ lỗi trong nó cho mục đích này nếu bạn chuyển -g trên dòng lệnh tới GCC. –
Tại sao không sử dụng gdb, tôi có thể hỏi? Ngoài ra, phần [Backtraces của hướng dẫn sử dụng GNU libc] (http://www.gnu.org/s/hello/manual/libc/Backtraces.html) có vẻ hữu ích. –