我想要一个C程序在某些情况下生成核心转储.这是一个在生产环境中运行的程序,不容易停止和重新启动以调整其他类型的调试代码.此外,由于它在生产环境中,我不想调用abort().调查中的问题不容易在非生产环境中复制.我想要的是程序,当它检测到某些问题时,自己产生核心转储,最好有足够的信息来重命名文件,然后继续.
在这里和这里之前已经提出了与这个问题中的一个相似的点,并且我知道Google coredump库(我已经评估并发现它缺乏,但是如果我更好地理解这个问题,我可能会尝试并努力).
我想在不中断进程的情况下获取正在运行的Linux进程的核心转储.自然的方法是说:
if (!fork()) { abort(); }
Run Code Online (Sandbox Code Playgroud)
由于分叉进程获得原始进程内存的固定快照副本,因此我应该获得完整的核心转储,并且由于副本使用写时复制,因此通常应该很便宜.但是,这种方法的一个关键缺点是fork()只分叉当前线程,并且原始进程的所有其他线程将不存在于分叉副本中.
我的问题是,是否有可能以某种方式获得其他原始线程的相关数据.我不完全确定如何解决这个问题,但这里有几个我提出的子问题:
包含所有线程堆栈的内存是否仍然可用并在分叉进程中可访问?
是否可以(快速)枚举原始进程中的所有正在运行的线程并存储其堆栈基址的地址?据我了解,Linux上的线程堆栈的基础包含指向内核的线程簿记数据的指针,所以......
使用存储的线程基地址,您能读出分叉进程中每个原始线程的相关数据吗?
如果可能,也许只需要将其他线程的数据附加到核心转储.但是,如果该数据已经在fork的位置丢失,那么这种方法似乎没有任何希望.
我正面临着一个如此神秘的问题,我甚至不知道如何制定这个问题......我甚至无法发布任何代码.
我自己开发了一个大项目,从头开始.这几乎是发布时间,但我无法摆脱一些恼人的错误.我的程序不时写一个输出文件,在此期间我得到:
值得注意的是,即使使用相同的输入,这些错误也很少出现并且永远无法再现.Memcheck显示没有内存冲突,即使在之前发现错误的运行中也是如此.Cppcheck也没有抱怨.我强烈地使用STL和pthreads,但没有后者,也会发生错误.
我尝试了最新的g ++和icpc.我正在运行某些版本的Ubuntu,但我不相信这就是原因.
我很感谢你们,如何解决这些问题.提前致谢.
如果抛出的异常将由某个catch块处理,有没有办法在C++中抛出核心来抛出核心?当异常达到顶级时,我想要与g ++相似的东西.
例如,我想要这样的事情:
try {
bar();
try {
foo();
} catch(...) {
# pragma dump_at_throw_site
}
} catch(...) {
std::cerr << "There was a problem" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这样,如果从foo()或其被调用者到达foo()的调用站点抛出的任何异常将导致在throw站点进行核心转储,那么可以看到是谁抛出了使其达到此级别的异常.
另一方面,bar()抛出的异常将被正常处理.
好吧所以不要问为什么,但我想创建一个我制作的测试程序的核心文件.它没有损坏,也没有搞砸,但我想生成它的核心文件.下面是代码:
#include <stdio.h>
int main(){
printf("TEST");
}
Run Code Online (Sandbox Code Playgroud)
正如我所说的那么简单,但我希望能够转储它的核心.我该怎么做?顺便说一下,我在Ubuntu 10.04上
我想在 C++ 进程中的一个/一些线程中调试和识别内存泄漏。一旦内存使用率非常高,我想获得进程的线程转储。
我知道对于 Java,以下命令有效,“kill -3”[linux] 或“sendsignal.exe”(http://www.latenighthacking.com/projects/2003/sendSignal/)
有没有办法在 Windows 上获取 C++ 进程的线程转储。
这个线程是否相关: How to programmatically cause a core dump in C/C++
谢谢你。
假设你分配一些数组arr size n,如下所示:
int arr[n]; // Allocated fine
printf("%d", arr[n]); // Segfault if possible
Run Code Online (Sandbox Code Playgroud)
是否存在这样的数字n,我总是可以在printf线上触发段错误?这可能是某些操作系统特有的.
我知道它的未定义行为,我知道当访问它并将其更改为超出范围将影响另一个内存区域(可能)会导致我以后出现重大问题.
我的教授说它并不总是会出现段错误,而且我很好奇是否在任何情况下都会创建一个某种尺寸的数组,某些类型的操作系统或计算机每次都会可靠地进行段错误.
这是可能的还是没有?是否存在一些我可以创建的条件,这将导致单个越界访问始终触发段错误.
它是理论上可能是永远正确的?但是在实践中不会一直发生这种情况吗?