스택 추적 출력을 stderr로 가져 오거나 로그 파일로 덤프하는 데 문제가 있습니다. gcc 컴파일러 (4.4.3)를 사용하여 쿠분투 10.04에서 코드를 실행하고 있습니다. 문제는 정상적인 실행 모드 (gdb 제외)에서 'Segmentation Fault'를 제외하고 아무것도 출력하지 않는다는 것입니다. 아래의 print 문과 같이 백 트레이스 출력을 출력하고 싶습니다.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
이상한 일들이 내가 내에서 함수를 호출하는 경우 작동한다는 것입니다 : 내 응용 프로그램과 함께 GDB를 실행하면 선언문의 printf/fprintf와/(함수 호출)에 제공하고 다음 문 충돌 충돌하는 동일한 파일, 그것은 잘 작동하고 제대로 출력 spews. 그러나이 파일 외부의 함수에서 프로그램이 중단되면 출력을 인쇄하지 않습니다. 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());
}
미리 도움을 청하십시오.
하지만이 스레드에서 전처리 기의 출력을 생성하는 사용자가 많습니다. http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c -app-crashes – gunjan