如何按指针查看堆栈跟踪

How to see stack trace by pointer

本文关键字:堆栈 跟踪 何按 指针      更新时间:2023-10-16

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

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

为了获得最佳结果,请在不优化的情况下进行编译。

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

你也可以看看getcontext.它记录了ucontext_t结构和mcontext_t结构。

此外,通过使用sigaction[带SA_SIGINFO],信号处理程序可以接收指向siginfo_t的指针和指向ucontext_t的指针。

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

我甚至能够强制多个线程执行此操作,通常,通过向各个线程发送信号,每个处理程序将转储其给定线程堆栈的堆栈[带有寄存器值]。


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

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

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

对于非常棘手的调试问题,您可以编写自己的自定义ptrace程序,目标程序知道,并且它们可以协同工作来解决问题。

或者,上述所有内容的某种组合。

在计算中,堆栈跟踪(也称为堆栈回溯或堆栈回溯(是某个点的活动堆栈帧的报告 在程序执行期间及时。

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