相关疑难解决方法(0)

我的程序崩溃时如何自动生成堆栈跟踪

我正在使用GCC编译器在Linux上工作.当我的C++程序崩溃时,我希望它能自动生成一个堆栈跟踪.

我的程序由许多不同的用户运行,它也可以在Linux,Windows和Macintosh上运行(所有版本都使用编译gcc).

我希望我的程序能够在崩溃时生成堆栈跟踪,并且在用户下次运行它时,它会询问他们是否可以将堆栈跟踪发送给我,以便我可以追踪问题.我可以处理向我发送信息,但我不知道如何生成跟踪字符串.有任何想法吗?

c++ crash gcc assert stack-trace

561
推荐指数
20
解决办法
33万
查看次数

用C或C++打印调用堆栈

有没有办法在每次调用某个函数时在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 c++ linux callstack

98
推荐指数
8
解决办法
15万
查看次数

如何在C中获取堆栈跟踪?

我知道没有标准的C函数来做到这一点.我想知道Windows和*nix上的技术是什么?(Windows XP是我现在最重要的操作系统.)

c windows debugging cross-platform stack-trace

80
推荐指数
7
解决办法
10万
查看次数

如何使用带有行号信息的gcc获取C++的堆栈跟踪?

我们在专有的assert宏中使用堆栈跟踪来捕获开发人员的错误 - 当捕获错误时,打印堆栈跟踪.

我发现gcc的配对backtrace()/ backtrace_symbols()方法不足:

  1. 名称被破坏了
  2. 没有行信息

第一个问题可以通过abi :: __ cxa_demangle来解决.

然而,第二个问题更加艰难.我发现了替换backtrace_symbols().这比gcc的backtrace_symbols()更好,因为它可以检索行号(如果使用-g编译),并且不需要使用-rdynamic进行编译.

Hoverer代码是GNU许可的,所以恕我直言我不能在商业代码中使用它.

任何建议?

PS

gdb能够打印传递给函数的参数.可能已经要求太多了:)

PS 2

类似的问题(感谢nobar)

c++ linux gcc stack-trace

57
推荐指数
8
解决办法
6万
查看次数

C程序如何在不终止的情况下产生自身的核心转储?

我想要一个C程序在某些情况下生成核心转储.这是一个在生产环境中运行的程序,不容易停止和重新启动以调整其他类型的调试代码.此外,由于它在生产环境中,我不想调用abort().调查中的问题不容易在非生产环境中复制.我想要的是程序,当它检测到某些问题时,自己产生核心转储,最好有足够的信息来重命名文件,然后继续.

c debugging coredump

30
推荐指数
2
解决办法
1万
查看次数

glibc函数检索当前的可执行文件名?

我想知道是否有一个glibc函数,我可以使用gcc/g ++来检索当前的可执行文件.

这样做的目的是提供-e参数, addr2line本答案所示

c gcc glibc addr2line

12
推荐指数
2
解决办法
9016
查看次数

用c ++打印完整的回溯

我想以类似于在gdb中完成的格式从Linux中的C++程序转储回溯.为此,我尝试使用backtrace()和backtrace_symbols()函数.这些返回的函数名称和偏移量.我可以使用__cxa_demangle()函数来获取可读的函数名称.

有没有办法获得文件/行位置,因为它是由gdb完成的?

c++ linux g++ backtrace

8
推荐指数
1
解决办法
2万
查看次数

C ++:assert()故障是否触发任何信号?

我想在断言失败时使用此stacktrace方法#4实现。

因此,如果没有信号触发,您能否建议一种在可执行文件退出之前检测断言失败的方法?

c++ assert

3
推荐指数
1
解决办法
1865
查看次数

如何获取GDB的行号?

有没有具体的方法来做到这一点?我说的是一般用途.当我尝试在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)

c++ gdb

2
推荐指数
1
解决办法
1万
查看次数