在Linux上工作我正在尝试构建一个Crash Handler函数 - 所以在崩溃之前我们在日志文件中获得堆栈跟踪 - 完成了一些研究并开始了解,它使用-g / -rdynamic Flags生成调试信息,然后使用glibc backtrace / backtrace_symbols_fd函数来获取堆栈跟踪......
它在我的应用程序中使用不多,不允许使用-g / -rdynamic标志.. 所以进一步阅读reading
我构建了以下不能按预期工作的代码,并且在生成的日志文件中,它以下列错误结束:
(gdb) Hangup detected on fd 0
error detected on stdin
A debugging session is active.
Inferior 1 [process 6625] will be detached.
Quit anyway? (y or n) [answered Y; input not from terminal]
Detaching from program: /u/vivek/demo/testprg, process 6625
代码: 在启动时注册Crash Handler功能 -
struct sigaction act;
memset(&act, 0, sizeof (act));
act.sa_sigaction = ProcessCrash;
sigfillset (&act.sa_mask);
act.sa_flags = SA_SIGINFO;
sigaction (SIGSEGV, &act, NULL);
当我的程序收到SIGSEGV信号时调用的函数 -
void ProcessCrash( int signal, siginfo_t * siginfo, void *context)
{
cerr <<"** ProcessCrash –Handler Function**" << endl;
ucontext_t *uc = (ucontext_t *)context;
if (signal == SIGSEGV)
fprintf(stderr, "\nGot signal %d, faulty address is %p, "
"from %p\n\n", signal, siginfo->si_addr,
uc->uc_mcontext.gregs[REG_RIP]); // REG_EIP is changed to REG_RIP for –m64 arch.
else
fprintf(stderr, "Got signal %d#92;\n", signal);
// [[ using GDB to pring the stack trace
char gdb[516];
// command 1
//sprintf(gdb, "echo 'where\ndetach' | gdb -q %.256s -pid %d > gdbTest.dump", program_invocation_name, getpid());
// command 2
sprintf(gdb, "(echo \"source Trace.txt\";cat) | gdb -q %.256s -pid %d > gdbTest.dump", program_invocation_name, getpid());
fprintf(stderr, "\n** GDB Command-> %s \n", gdb);
// output of above is
// ** GDB Command-> (echo "source Trace.txt";cat) | gdb -q /u/vivek/demo/testprg -pid 6625 > gdbTest.dump
// Run Either command 1 or command 2 but we get the same result
system(gdb);
// GDB test ]]
// Produce a core dump
abort();
return;
}
Trace.txt内容:
set logging on
where
detach
quit
请让我知道有没有办法摆脱它...因为我没有想法克服它..
答案 0 :(得分:0)
不确定您打算对(echo \"source Trace.txt\";cat) |
部分做什么。
就我所知,简单地使用gdb -batch -x Trace.txt -q %.256s -pid %d > gdbTest.dump
可以正常工作。