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