如何按指针查看堆栈跟踪
How to see stack trace by pointer
我有指向某个分配内存的唯一指针,我可以通过该指针在代码中获取堆栈跟踪吗?
我知道如何从方法获取堆栈跟踪,但是如果我在另一个方法中捕获异常怎么办 - 我可以获取堆栈跟踪吗?
为了获得最佳结果,请在不优化的情况下进行编译。
在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
的程序(例如gdb
或strace
(以获取信息。
或者,您可以使用调试printf
调用来检测代码,以获取有关谁调用了什么、使用什么值等的详细列表。
对于非常棘手的调试问题,您可以编写自己的自定义ptrace
程序,目标程序知道,并且它们可以协同工作来解决问题。
或者,上述所有内容的某种组合。
在计算中,堆栈跟踪(也称为堆栈回溯或堆栈回溯(是某个点的活动堆栈帧的报告 在程序执行期间及时。
它将允许您跟踪函数调用的顺序以及您调用的函数的堆栈帧列表。指针变量与堆栈跟踪无关。它只包含一个地址。
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 提升堆栈跟踪不显示函数名称和行号
- cygwin_exception::open_stackdumpfile:将堆栈跟踪转储到 class4.exe.sta
- 如何按指针查看堆栈跟踪
- WinDbg 不显示某些小型转储文件的完整堆栈跟踪
- 发布代码的 gdb 堆栈跟踪可读性如何影响 x64?
- 提升::堆栈跟踪::safe_dump_to输出大小
- Qt 5.9中的QML崩溃-帮助读取堆栈跟踪
- 如何获取崩溃的DLL的堆栈跟踪?
- 当外部源代码中发生异常时,无法正确使用自创建的小型转储文件的堆栈跟踪
- 在 Linux 平台上以 C/C++ 打印进程的所有线程堆栈跟踪
- Boost 堆栈跟踪异步信号安全吗?
- 使用 gdb 时无法获取堆栈跟踪
- VC++ 堆栈跟踪不会解析生产环境中的函数名称
- 从堆栈跟踪中查找共享库中的源代码行
- 捕获异常后的堆栈跟踪
- 是否有一种便携式/标准的方法可以在堆栈跟踪中获取文件名和亚麻布
- 为什么谷歌测试不打印堆栈跟踪或文件名
- 在明夫中打印堆栈跟踪
- GDB 显示奇怪的堆栈跟踪