我正在使用GCC编译器在Linux上工作.当我的C++程序崩溃时,我希望它能自动生成一个堆栈跟踪.
我的程序由许多不同的用户运行,它也可以在Linux,Windows和Macintosh上运行(所有版本都使用编译gcc).
我希望我的程序能够在崩溃时生成堆栈跟踪,并且在用户下次运行它时,它会询问他们是否可以将堆栈跟踪发送给我,以便我可以追踪问题.我可以处理向我发送信息,但我不知道如何生成跟踪字符串.有任何想法吗?
有没有办法在每次调用某个函数时在C或C++中正在运行的进程中转储调用堆栈?我的想法是这样的:
void foo()
{
print_stack_trace();
// foo's body
return
}
Run Code Online (Sandbox Code Playgroud)
其中的print_stack_trace工作方式类似于callerPerl.
或类似的东西:
int main (void)
{
// will print out debug info every time foo() is called
register_stack_trace_function(foo);
// etc...
}
Run Code Online (Sandbox Code Playgroud)
在哪里register_stack_trace_function放置某种内部断点,这将导致在调用时打印堆栈跟踪foo.
在某些标准C库中是否存在这样的事情?
我正在使用GCC在Linux上工作.
我有一个测试运行,基于一些不应该影响此行为的命令行开关,行为不同.我的代码有一个伪随机数生成器,我假设它是基于这些开关被不同地调用的.我希望能够使用每组开关运行测试,并查看随机数生成器是否针对每个开关进行不同的调用.
我知道没有标准的C函数来做到这一点.我想知道Windows和*nix上的技术是什么?(Windows XP是我现在最重要的操作系统.)
我们在专有的assert宏中使用堆栈跟踪来捕获开发人员的错误 - 当捕获错误时,打印堆栈跟踪.
我发现gcc的配对backtrace()/ backtrace_symbols()方法不足:
第一个问题可以通过abi :: __ cxa_demangle来解决.
然而,第二个问题更加艰难.我发现了替换backtrace_symbols().这比gcc的backtrace_symbols()更好,因为它可以检索行号(如果使用-g编译),并且不需要使用-rdynamic进行编译.
Hoverer代码是GNU许可的,所以恕我直言我不能在商业代码中使用它.
任何建议?
PS
gdb能够打印传递给函数的参数.可能已经要求太多了:)
PS 2
类似的问题(感谢nobar)
我想要一个C程序在某些情况下生成核心转储.这是一个在生产环境中运行的程序,不容易停止和重新启动以调整其他类型的调试代码.此外,由于它在生产环境中,我不想调用abort().调查中的问题不容易在非生产环境中复制.我想要的是程序,当它检测到某些问题时,自己产生核心转储,最好有足够的信息来重命名文件,然后继续.
我想知道是否有一个glibc函数,我可以使用gcc/g ++来检索当前的可执行文件.
这样做的目的是提供-e参数, addr2line如本答案所示
我想以类似于在gdb中完成的格式从Linux中的C++程序转储回溯.为此,我尝试使用backtrace()和backtrace_symbols()函数.这些返回的函数名称和偏移量.我可以使用__cxa_demangle()函数来获取可读的函数名称.
有没有办法获得文件/行位置,因为它是由gdb完成的?
我想在断言失败时使用此stacktrace方法#4实现。
因此,如果没有信号触发,您能否建议一种在可执行文件退出之前检测断言失败的方法?
有没有具体的方法来做到这一点?我说的是一般用途.当我尝试在GDB中启动我的程序时,我收到此通知:
Reading symbols from /home/amsterdam/Code/c++/opengl_03/bin/opengl_03...(no debugging symbols found)...done.
Run Code Online (Sandbox Code Playgroud)
这让我想知道我是否必须为此找到一个特定的文件?
更新
注意:我已经尝试过以下命令:
nm --debug-sym <your_executable> | grep debug
没有成功; 它拒绝显示任何东西.
这是我的Makefile:
BIN = bin/
OBJ = obj/
TARGET = opengl_03
DEPS = main.o displayinit.o initializer.o algorithms.o matrix3f.o window.o vertex3.o
CC = g++
CFLAGS = -g -ggdb
LIBS = -lglut -lGLEW -lGL
INCLUDEPATH = -L/usr/include/ -L/usr/lib/ -L/usr/lib/x86_64-linux-gnu/
$(TARGET) : $(DEPS)
$(CC) $(CFLAGS) -o $(BIN)$(TARGET) $(DEPS) $(LIBS) $(INCLUDEPATH)
displayinit.o : displayinit.cpp displayinit.h
$(CC) $(CFLAGS) -c displayinit.cpp $(LIBS) $(INCLUDEPATH) #&& mv displayinit.o $(OBJ)displayinit.o
initializer.o …Run Code Online (Sandbox Code Playgroud)