gpt4 book ai didi

c++ - 在 c/c++ 中使用函数 system() 调用管道传输到 where 的 gdb,以记录堆栈跟踪 - 在 fd 0 上检测到错误挂断

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:58 26 4
gpt4 key购买 nike

在 Linux 上工作,我正在尝试构建一个崩溃处理程序函数 - 以便在崩溃之前我们在日志文件中获得堆栈跟踪 -做了一些研究并知道,它要么使用 -g/-rdynamic 标志生成调试信息,然后使用 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

请让我知道有没有办法解决它...因为我没有想法来克服它..

最佳答案

不确定您打算对 (echo\"source Trace.txt\";cat) | 部分做什么。据我所知,只需使用 gdb -batch -x Trace.txt -q %.256s -pid %d > gdbTest.dump 就可以正常工作。

关于c++ - 在 c/c++ 中使用函数 system() 调用管道传输到 where 的 gdb,以记录堆栈跟踪 - 在 fd 0 上检测到错误挂断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18955503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com