gpt4 book ai didi

c++ - 在 Windows 下获取指向调用堆栈底部的指针并通过地址(如 dladdr)解析符号?

转载 作者:搜寻专家 更新时间:2023-10-31 01:58:37 31 4
gpt4 key购买 nike

我想在 Windows 下实现回溯实用程序的模拟,以便将此信息添加到异常中。

我需要捕获返回地址,然后将其转换为符号名称。

我知道 StackWalk64 和 StackWalker project但不幸的是它有几个重要的缺点:

  • 众所周知,它非常慢(StackWalk64),我不想浪费太多时间来收集跟踪,基本上可以像在链表上行走一样快地完成。
  • 已知函数 StackWalk64 不是线程安全的。

我只想支持 x86 和可能的 x86_64 架构

我的基本想法如下:

  1. 使用 esp/ebp 寄存器在堆栈上运行,类似于 GCC 的 __builtin_return_address(x)/__builtin_frame_address(x) 直到到达堆栈底部(这是glibc 的作用)。
  2. 将地址翻译成符号
  3. 拆解它们。

问题/疑问:

  1. 我怎么知道我到达了栈顶?例如 glibc 实现有 __libc_stack_end 所以很容易找到停止的地方。 Windows下有类似的东西吗?如何获取栈底地址?
  2. dladdr 功能的类似物是什么。现在我知道,与保留大部分符号名称的 ELF 平台不同,PE 格式没有。所以它应该以某种方式读取调试信息。有什么想法吗?

最佳答案

  • 捕获堆栈跟踪:RtlCaptureStackBackTrace
  • 获取符号:使用 DBG 帮助库(仅限 MSVC)。主要功能:

    // Initialization
    hProcess = GetCurrentProcess()
    SymSetOptions(SYMOPT_DEFERRED_LOADS)
    SymInitialize(hProcess, NULL, TRUE)
    // Fetching symbol
    SymFromAddr(...)

    可以找到实现there

关于c++ - 在 Windows 下获取指向调用堆栈底部的指针并通过地址(如 dladdr)解析符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3802710/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com