我只有指向某些已分配内存的指针,可以通过该指针在代码中获取堆栈跟踪吗?
我知道如何从一个方法获取堆栈跟踪,但是如果我在另一个方法中捕获到异常,该怎么办?我可以获取堆栈跟踪吗?
答案 0 :(得分:1)
为了获得最佳结果,请编译而不进行优化。
在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
。) / p>
通常,通过向单个线程发送信号,我甚至能够强制多个线程执行此操作,并且每个处理程序都会为给定的线程堆栈[使用寄存器值]转储堆栈。
这有助于了解您要实现的目标(例如调试)。
通常,人们使用基于外部ptrace
的程序(例如gdb
或strace
)来获取信息。
或者,您可以使用调试printf
调用来检测代码,以获取有关谁调用了什么,使用什么值等的详细列表。
对于非常棘手的调试问题,您可以编写自己的自定义ptrace
程序,目标程序可以识别该程序,并且它们可以一起解决问题。
或者是以上所有方式的组合。
答案 1 :(得分:0)
在计算中,堆栈跟踪(也称为堆栈回溯或堆栈回溯)是在特定点上活动堆栈帧的报告 在程序执行过程中及时完成。
它将允许您跟踪函数调用的顺序以及所调用函数的堆栈框架列表。指针变量与堆栈跟踪无关。它只是一个地址。