相关疑难解决方法(0)

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

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

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

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

c++ crash gcc assert stack-trace

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

C++显示异常时的堆栈跟踪

如果抛出异常,我想有办法向用户报告堆栈跟踪.做这个的最好方式是什么?是否需要大量的额外代码?

回答问题:

如果可能的话,我希望它是便携式的.我想要弹出信息,因此用户可以复制堆栈跟踪并在出现错误时通过电子邮件发送给我.

c++ exception-handling exception stack-trace

183
推荐指数
9
解决办法
19万
查看次数

如何在C++中使用C++和代码注入为已捕获的异常打印堆栈跟踪

我希望堆栈跟踪不仅适用于我的例外,也适用于任何后代 std::exception

据我所知,由于堆栈展开(展开),捕获异常时堆栈跟踪完全丢失.

所以我看到抓住它的唯一方法是在std::exception构造函数调用的地方注入代码保存上下文信息(堆栈跟踪).我对吗?

如果是这种情况,请告诉我如何在C++中完成代码注入(如果可以).您的方法可能不完全安全,因为我只需要我的应用程序的调试版本.可能是我需要使用汇编程序?

我只对GCC的解决方案感兴趣.它可以使用c ++ 0x功能

c++ gcc exception-handling code-injection c++11

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

从catch块获取回溯

我正在使用backtrace从抛出异常的位置获取信息.在我的异常的构造函数中,我将回溯存储在std :: string中,并且在catch块中为此类型的异常存储,我正在打印此回溯.

但我想知道,是否有可能以某种方式在catch块中为其他异常类型获得相同的回溯?

c++ linux exception-handling backtrace

15
推荐指数
2
解决办法
8377
查看次数

c ++ stacktrace从函数抛出异常?

我可以利用gcc的backtrace在程序的任何给定点获得堆栈跟踪,但是我想从抛出异常时堆栈所处的任何帧中获取跟踪,即在堆栈展开之前.

例如,以下块

func() {
  throw std::exception();
}

try {
  func();
}
catch ( std::exception ) {
  std::cout << print_trace();
  //do stuff
}
Run Code Online (Sandbox Code Playgroud)

应该还能以某种方式为func()保留一个框架.

以前曾经问过这个问题,但它涉及到一个未处理的异常会终止该程序,并且可能没有给callstack一个放松的机会?

有没有办法做到这一点,同时仍能正常捕获和处理异常?

可能有一种方法,比如为所有异常设置处理程序,除了生成跟踪并重新抛出异常之外什么都不做.理想情况下,我应该能够在Exception类构造函数中生成跟踪,但是在这里我不一定能控制可能遇到的异常.

c++ gcc callstack exception-handling stack-trace

5
推荐指数
1
解决办法
2204
查看次数

从未捕获的异常获取堆栈跟踪?

我意识到这将是特定于平台的:是否有任何方法可以从未捕获的C ++异常中获取堆栈跟踪,但是从抛出异常的那一点来看呢?

我有一个Windows结构化异常处理程序来捕获访问冲突等,并生成一个小型转储。但是当然,由于未捕获的C ++异常而在终止事件中不会调用该函数,因此没有崩溃转储。

我目前正在寻找Windows解决方案(无论多么肮脏!),但如果可能,希望了解其他平台。

谢谢。

c++ windows exception stack-trace

4
推荐指数
2
解决办法
4420
查看次数

Linux是否记录了守护程序抛出的未捕获异常?

我用C++编写了一个Linux守护进程.代码是这样的:

int main(int argc, char** argv)
{
    daemon(1, 0); // Daemonize itself, retaining the current working directory and redirecting stdin, stdout and stderr to /dev/null.
    // My program logic goes here
}
Run Code Online (Sandbox Code Playgroud)

问题是,我的程序逻辑偶尔抛出异常.如何捕获异常以便我可以知道哪里出错了?

我知道对于普通的控制台应用程序,未捕获的异常将被转储到控制台.在我的例子中,在调用守护进程(1,0)之后,控制台不再可访问.

在Windows上,操作系统将保存任何未捕获的异常,并可通过"计算机管理"中的"事件查看器"查看.Linux上是否有类似的机制?

c++ linux events daemon exception

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