如何通过指针查看堆栈跟踪

时间:2020-06-06 19:53:15

标签: c++ c

我只有指向某些已分配内存的指针,可以通过该指针在代码中获取堆栈跟踪吗?

我知道如何从一个方法获取堆栈跟踪,但是如果我在另一个方法中捕获到异常,该怎么办?我可以获取堆栈跟踪吗?

2 个答案:

答案 0 :(得分:1)

为了获得最佳结果,请编译而不进行优化。

gcc [和也许 clang]下,您可以使用:__builtin_frame_address__builtin_return_address。有关详细信息,请参见man gcc(或仅通过网络进行搜索)。

您也可以查看getcontext。它记录了ucontext_t结构和mcontext_t结构。

此外,通过将sigactionSA_SIGINFO一起使用,您的信号处理程序可以接收指向siginfo_t的指针和指向ucontext_t的指针。

过去,我已经能够使用上述组合来从信号处理程序生成堆栈跟踪(有关可以从信号处理程序安全调用的函数的详细信息,请参见man 7 signal。) / p>

通常,通过向单个线程发送信号,我甚至能够强制多个线程执行此操作,并且每个处理程序都会为给定的线程堆栈[使用寄存器值]转储堆栈。


这有助于了解您要实现的目标(例如调试)。

通常,人们使用基于外部ptrace的程序(例如gdbstrace)来获取信息。

或者,您可以使用调试printf调用来检测代码,以获取有关谁调用了什么,使用什么值等的详细列表。

对于非常棘手的调试问题,您可以编写自己的自定义ptrace程序,目标程序可以识别该程序,并且它们可以一起解决问题。

或者是以上所有方式的组合。

答案 1 :(得分:0)

在计算中,堆栈跟踪(也称为堆栈回溯或堆栈回溯)是在特定点上活动堆栈帧的报告 在程序执行过程中及时完成。

它将允许您跟踪函数调用的顺序以及所调用函数的堆栈框架列表。指针变量与堆栈跟踪无关。它只是一个地址。

相关问题