首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不使c中的进程崩溃的情况下生成核心转储?

如何在不使c中的进程崩溃的情况下生成核心转储?
EN

Stack Overflow用户
提问于 2018-03-02 08:21:29
回答 2查看 2.1K关注 0票数 1

是否有可能在不使进程崩溃的情况下生成用于调试目的的小型核心转储。比方说,如果一个函数接收到一个意外的值,仅仅打印日志并优雅地返回可能不足以调试问题。另一方面,如果我可以获得内存的截图并查看堆栈,我就可以找到更多有用的信息来进行调试。

EN

回答 2

Stack Overflow用户

发布于 2018-03-02 08:38:35

是,

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

代码语言:javascript
运行
复制
(gdb) gcore
(gdb) q

这会将内核转储到"core.pid“,而不会导致进程崩溃。

或者下面这一行:

代码语言:javascript
运行
复制
sudo sh -c 'echo gcore <output_core> | gdb -p <pid>'
票数 2
EN

Stack Overflow用户

发布于 2018-05-01 09:36:53

这样做并不需要构建函数,您可以使用ptrace()来调试您自己的进程,但这并不容易。调用gcore是最简单的方法。

代码语言:javascript
运行
复制
#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);
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49060875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档