跟踪本机调用
Tracing Native Calls
这是与Win32相关的问题,所有代码都是本机的。
我有 3 层编译为 dll 库,彼此依赖:
[模块 1] -> [模块 2] -> [模块 3] -> [我的模块 4]
模块1 是应用加载模块 2。模块 2 加载模块 3。模块 3 加载我的模块 4。
每当从模块 1 进行调用时,它都会经过模块 4 之前的所有层。
在模块 4 中,我想以某种方式跟踪它是由模块 3 从模块 2 从模块 1 调用的,例如通过获取每个模块的 HMOUDLE 句柄或其他唯一标识它们的东西。我想不出任何 Win32 API 允许我执行这样的跟踪,你能建议吗?
您应该能够在感兴趣的STACKFRAME64结构的相关地址上使用 StackWalk64 和 SymFromAddr。不是你想要的,但想不出任何其他方法可以接近。
简短的回答 - 有点,但你可能不想这样做:)
冗长的答案 - 调试帮助库可用于生成堆栈跟踪(通过 StackWalk64),您可以将其与通过 PSAPI 检索的模块信息一起使用,以获取所需的内容。
基本方法是获取流程中每个模块的基址和大小,然后查看每个堆栈帧的返回地址,按范围匹配。 如果您只想确定对模块 4 中函数的调用是否源自模块 1,这将带您到达您想要的位置。
编辑:如果你可以访问相关模块的符号,那么Steve T的答案会更强大一些。
相关文章:
- 在这种情况下,java对象是否可以调用本机函数
- 多次调用本机方法时出现致命错误
- 终止调用本机代码的 .Net 线程
- 在使用该名称创建变量后调用本机 C 函数
- AccessViolationException从托管C (ASP.NET的包装器)调用本机C 代码
- 如何从 JNI 传递 std::list 参数来调用本机 C++ 函数
- 从 Android 中的原生 c++ 文件调用本机 opencv
- NDK - 包含一个预构建的库,并在 Android 项目中调用本机函数
- 从 C# 调用本机C++函数
- 从java调用本机方法时使用Libc SIGSEGV
- 如何从VM调用本机函数
- 使用JNI从Java调用本机(C++)函数时发生访问冲突:这是我的代码问题,还是已知问题
- 无法调用本机方法 Eclipse
- Java:调用本机方法,给出"线程"main"java.lang.UnsatisfiedLinkError中的异常"
- 从托管代码调用本机函数
- 从带有 out 参数的 c# 调用本机 c++ 代码
- 使用 c++/cli 中的 std::string 参数调用本机 c++ dll
- 从 C# 应用调用本机函数
- 从Android Java调用本机函数 - JNI的替代品
- 从Unity3d调用本机DLL的最佳方式是什么