C++ 如何通过指针查看堆栈跟踪
我只有一个指向某个已分配内存的指针,我可以通过该指针在代码中获得堆栈跟踪吗 我知道如何从一个方法中获取堆栈跟踪,但如果我在另一个方法中捕获到异常,该怎么办?我可以获取堆栈跟踪吗 在计算中,堆栈跟踪(也称为堆栈回溯或堆栈回溯)是某一点上活动堆栈帧的报告 在程序执行过程中的时间 它将允许您跟踪函数调用的顺序以及所调用函数的堆栈帧列表。指针变量与堆栈跟踪无关。它只有一个地址 为了获得最佳结果,编译时不进行优化 在C++ 如何通过指针查看堆栈跟踪,c++,c,C++,C,我只有一个指向某个已分配内存的指针,我可以通过该指针在代码中获得堆栈跟踪吗 我知道如何从一个方法中获取堆栈跟踪,但如果我在另一个方法中捕获到异常,该怎么办?我可以获取堆栈跟踪吗 在计算中,堆栈跟踪(也称为堆栈回溯或堆栈回溯)是某一点上活动堆栈帧的报告 在程序执行过程中的时间 它将允许您跟踪函数调用的顺序以及所调用函数的堆栈帧列表。指针变量与堆栈跟踪无关。它只有一个地址 为了获得最佳结果,编译时不进行优化 在gcc[可能还有clang]下,您可以使用:\u内置\u帧\u地址和\u内置\u返回\u地
gcc
[可能还有clang
]下,您可以使用:\u内置\u帧\u地址
和\u内置\u返回\u地址
。有关详细信息,请参见mangcc
[或仅通过Web搜索]
您还可以查看getcontext
。它记录了ucontext\u t
struct和mcontext\u t
struct
此外,通过使用sigaction
[与SA_SIGINFO
],您的信号处理程序可以接收指向SIGINFO\u t
的指针和指向ucontext\u t
的指针
在过去,我能够使用上述组合从信号处理程序生成堆栈跟踪(有关可以从信号处理程序安全调用哪些函数的详细信息,请参见man7 signal
)
我甚至可以强制多个线程执行此操作,通常是通过向各个线程发送信号,每个处理程序都会为其给定的线程堆栈转储堆栈[带有寄存器值]
它有助于了解您想要实现的目标(例如调试) 通常,用户使用基于外部
ptrace
的程序(例如gdb
或strace
)获取信息
或者,您可以使用debugprintf
调用插入代码,以获得谁调用了什么、使用了什么值等的详细列表
对于非常棘手的调试问题,您可以编写自己的自定义ptrace
程序,目标程序知道这些程序,并且它们可以一起解决问题
或者,上面所有内容的某种组合。指针只是一个保存内存地址的变量。为什么您希望能够从中获取堆栈跟踪?我根本不知道-只是问是否可能,因为在windbg中,我可以获取特定内存块的堆栈跟踪。无法保证堆栈和堆位于同一内存段中。我建议编写一个{inline}汇编语言函数,返回堆栈指针的值。您必须找出帧在堆栈中的位置。