我在將堆棧跟蹤輸出轉儲到stderr或轉儲到日誌文件時遇到問題。我使用gcc編譯器(4.4.3)運行Kubuntu10.04中的代碼。問題是,在正常運行模式下(沒有gdb),程序不會輸出除「Segmentation Fault」外的任何內容。我希望按照下面的打印語句輸出回溯輸出。當我運行GDB與我的應用程序,它涉及到的printf/fprintf中/(函數調用)語句,然後用下面的語句崩潰:在gcc的SIGSEGV期間,C++程序不處理任何函數調用或printf
669 {
(gdb)
670 printf("Testing for stability.\n");
(gdb)
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00007ffff68b1f45 in puts() from /lib/libc.so.6
奇怪的事情是,它的工作原理,如果我中調用一個函數同樣的文件崩潰,它工作正常,並正確地噴出輸出。但是,如果該程序在該文件外的某個函數中崩潰,則不會打印任何輸出。 因此沒有處理printf或文件轉儲語句或函數調用。我正在使用以下示例代碼:
void bt_sighandler(int sig, siginfo_t *info,
void *secret) {
void *trace[16];
char **messages = (char **)NULL;
int i, trace_size = 0;
ucontext_t *uc = (ucontext_t *)secret;
/* Do something useful with siginfo_t */
if (sig == SIGSEGV)
printf("Got signal %d, faulty address is %p, "
"from %p\n", sig, info->si_addr,
uc->uc_mcontext.gregs[0]);
else
printf("Got signal %d#92; \n", sig);
trace_size = backtrace(trace, 16);
/* overwrite sigaction with caller's address */
trace[1] = (void *) uc->uc_mcontext.gregs[0];
messages = backtrace_symbols(trace, trace_size);
/* skip first stack frame (points here) */
printf("[bt] Execution path:#92; \n");
for (i=1; i<trace_size; ++i)
printf("[bt] %s#92; \n", messages[i]);
exit(0);
}
int main() {
/* Install our signal handler */
struct sigaction sa;
sa.sa_sigaction = (void *)bt_sighandler;
sigemptyset (&sa.sa_mask);
sa.sa_flags = SA_RESTART | SA_SIGINFO;
sigaction(SIGSEGV, &sa, NULL);
sigaction(SIGUSR1, &sa, NULL);
/* Do something */
printf("%d#92; \n", func_b());
}
在此先感謝您的任何幫助。
但我看到很多人從處理程序生成輸出,從這個線程ex:http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c -app -crashes – gunjan 2011-03-22 12:14:25