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
)获取信息

或者,您可以使用debug
printf
调用插入代码,以获得谁调用了什么、使用了什么值等的详细列表

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


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

指针只是一个保存内存地址的变量。为什么您希望能够从中获取堆栈跟踪?我根本不知道-只是问是否可能,因为在windbg中,我可以获取特定内存块的堆栈跟踪。无法保证堆栈和堆位于同一内存段中。我建议编写一个{inline}汇编语言函数,返回堆栈指针的值。您必须找出帧在堆栈中的位置。