- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想在 Windows 下实现回溯实用程序的模拟,以便将此信息添加到异常中。
我需要捕获返回地址,然后将其转换为符号名称。
我知道 StackWalk64 和 StackWalker project但不幸的是它有几个重要的缺点:
我只想支持 x86 和可能的 x86_64 架构
我的基本想法如下:
__builtin_return_address(x)
/__builtin_frame_address(x)
直到到达堆栈底部(这是glibc 的作用)。__libc_stack_end
所以很容易找到停止的地方。 Windows下有类似的东西吗?如何获取栈底地址?最佳答案
获取符号:使用 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/
dladdr()的内存语义是什么? ? #define _GNU_SOURCE #include int dladdr(void *addr, Dl_info *info); typedef str
我已经使用 gcc 的 -finstrument-functions 选项和以下(简化的)代码实现了跟踪行为: void __cyg_profile_func_enter(void *this_fn,
在研究一些库时我发现了这种代码 Dl_info info = { NULL, NULL, NULL, NULL }; if (!dladdr((void*) dirSep, &
我正在为我的应用程序编写分析工具,并且我正在使用 dladdr 将函数指针转换为名称。只要我处于调试状态,一切都可以正常工作,但是一旦我在发行版中编译(使用 XCode 5.1),所有名称转换都会失败
我正在尝试使用 dladdr。它正确定位了库,但未找到函数名称。我可以调用 objdump,做一些数学运算,然后获取我传递给 dladdr 的函数的地址。如果 objdump 可以看到它,为什么 dl
我有一个程序(应用程序,不是共享库): void func() { int RESULT = UNW_ESUCCESS; unw_context_t context; unw_
我使用 dladdr 来获取库的完整路径: Dl_info dl_info; int ret = dladdr((void*)&func, &dl_info); if (ret)
我正在编写一个 C++ 异常类,它必须在抛出站点提供有限的回溯。由于我的应用程序将是多线程的,因此可能会同时抛出异常。我在 Internet 上搜索了这个线程安全问题,但没有找到。 backtrace
我无法获得带有间接函数的 elf 的 gnu 扩展以与 dladdr 一起工作。 在下面的例子中,fabs和sin是libm中的两个动态函数,其中sin也是一个间接函数从其指针查找 fabs 效果很好
希望这是一个相当简单的 C++ 问题(而不是语言律师问题)。 如何在 C++ 中使用 GNU 扩展 dladdr ?通常人们会用 C 编写以下内容: #ifndef _GNU_SOURCE #defi
我想在 Windows 下实现回溯实用程序的模拟,以便将此信息添加到异常中。 我需要捕获返回地址,然后将其转换为符号名称。 我知道 StackWalk64 和 StackWalker project但
我正在处理 LLVM Tutorial ,但我在编译时遇到了麻烦。我写了一个重现该问题的最小示例: #include "llvm/Module.h" #include "llvm/LLVMContex
我是一名优秀的程序员,十分优秀!