如何生成核心转储而不会崩溃c中的进程?

时间:2018-03-02 00:21:29

标签: c memory stack-trace

是否可以生成用于调试目的的迷你核心转储而不会导致进程崩溃。让我们说一个函数是否收到意外值,只是打印日志并优雅地返回可能不足以调试问题。另一方面,如果我可以获得内存的截图并查看堆栈,我可以找到更多有用的信息进行调试。

2 个答案:

答案 0 :(得分:2)

是,

根据gdb的documentation,一旦附加了gdb,您可以发出以下命令:

(gdb) gcore
(gdb) q

这会将核心转储到“core。 pid ”而不会导致进程崩溃。

或这个单行:

sudo sh -c 'echo gcore <output_core> | gdb -p <pid>'

答案 1 :(得分:0)

没有构建功能,您可以使用ptrace()来调试自己的进程,但这并不容易。致电gcore是最简单的方法。

#include <stdio.h>
#include <unistd.h>
#include <inttypes.h>
#include <sys/wait.h>

int main(void) {
  pid_t parent = getpid();
  pid_t pid = fork();
  if (pid < 0) {
    // oh dear we are on trouble
  } else if (pid == 0) {
    char tmp[42];
    snprintf(tmp, sizeof tmp, "%" PRIdMAX, (intmax_t)parent);
    execvp("gcore", (char *[]){"gcore", tmp, NULL});
  } else {
    int wstatus;
    waitpid(pid, &wstatus, 0);
  }
}