相关疑难解决方法(0)

如何以编程方式在C/C++中导致核心转储

我想在我的C++应用程序中的特定位置强制执行核心转储.

我知道我可以做以下事情:

int * crash = NULL;
*crash = 1;
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有更干净的方式?

我顺便使用Linux.

c c++ linux coredump abort

84
推荐指数
6
解决办法
7万
查看次数

从内部程序调用gdb打印其堆栈跟踪的最佳方法是什么?

使用这样的函数:

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

void print_trace() {
    char pid_buf[30];
    sprintf(pid_buf, "--pid=%d", getpid());
    char name_buf[512];
    name_buf[readlink("/proc/self/exe", name_buf, 511)]=0;
    int child_pid = fork();
    if (!child_pid) {           
        dup2(2,1); // redirect output to stderr
        fprintf(stdout,"stack trace for %s pid=%s\n",name_buf,pid_buf);
        execlp("gdb", "gdb", "--batch", "-n", "-ex", "thread", "-ex", "bt", name_buf, pid_buf, NULL);
        abort(); /* If gdb failed to start */
    } else {
        waitpid(child_pid,NULL,0);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在输出中看到了print_trace的细节.

有什么其他方法可以做到这一点?

c linux gdb stack-trace

58
推荐指数
3
解决办法
4万
查看次数

带螺纹的分叉和核心转储

这里这里之前已经提出与这个问题中的一个相似的点,并且我知道Google coredump库(我已经评估并发现它缺乏,但是如果我更好地理解这个问题,我可能会尝试并努力).

我想在不中断进程的情况下获取正在运行的Linux进程的核心转储.自然的方法是说:

if (!fork()) { abort(); }
Run Code Online (Sandbox Code Playgroud)

由于分叉进程获得原始进程内存的固定快照副本,因此我应该获得完整的核心转储,并且由于副本使用写时复制,因此通常应该很便宜.但是,这种方法的一个关键缺点是fork()只分叉当前线程,并且原始进程的所有其他线程将不存在于分叉副本中.

我的问题是,是否有可能以某种方式获得其他原始线程的相关数据.我不完全确定如何解决这个问题,但这里有几个我提出的子问题:

  1. 包含所有线程堆栈的内存是否仍然可用并在分叉进程中可访问?

  2. 是否可以(快速)枚举原始进程中的所有正在运行的线程并存储其堆栈基址的地址?据我了解,Linux上的线程堆栈的基础包含指向内核的线程簿记数据的指针,所以......

  3. 使用存储的线程基地址,您能读出分叉进程中每个原始线程的相关数据吗?

如果可能,也许只需要将其他线程的数据附加到核心转储.但是,如果该数据已经在fork的位置丢失,那么这种方法似乎没有任何希望.

c c++ linux coredump pthreads

22
推荐指数
1
解决办法
4192
查看次数

是否可以通过核心转储peridocally保存程序的状态?

我只想在不停止程序的情况下转储核心.这将是必要的序列化程序的整个状态.以后调试非常方便.

在linux下有可能吗?

linux debugging coredump

7
推荐指数
1
解决办法
831
查看次数

标签 统计

linux ×4

c ×3

coredump ×3

c++ ×2

abort ×1

debugging ×1

gdb ×1

pthreads ×1

stack-trace ×1