是否有可能在不使进程崩溃的情况下生成用于调试目的的小型核心转储。比方说,如果一个函数接收到一个意外的值,仅仅打印日志并优雅地返回可能不足以调试问题。另一方面,如果我可以获得内存的截图并查看堆栈,我就可以找到更多有用的信息来进行调试。
发布于 2018-03-02 08:38:35
是,
根据gdb的documentation,一旦附加到gdb,您可以发出以下命令:
(gdb) gcore
(gdb) q这会将内核转储到"core.pid“,而不会导致进程崩溃。
或者下面这一行:
sudo sh -c 'echo gcore <output_core> | gdb -p <pid>'发布于 2018-05-01 09:36:53
这样做并不需要构建函数,您可以使用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);
}
}https://stackoverflow.com/questions/49060875
复制相似问题