【问题标题】:VS2008 debugger and kernel32.dllVS2008调试器和kernel32.dll
【发布时间】:2011-05-19 23:01:43
【问题描述】:

我一直在调试一个进程(在 C++/windows 中),它使用 kernel32.dll 中的“GetThreadContext”。
我注意到我可以用

获得它的地址
unsigned long address = (unsigned long)(&GetThreadContext);

但是当我查看加载的模块选项卡时 - 我看到 kernel32.dll 的符号没有加载!
VS2008是怎么知道“GetThreadContext”的地址的?
如果没有 PDB,我怎么能自己做呢?
谢谢:)

【问题讨论】:

  • GetProcAddr(msdn.microsoft.com/en-gb/library/64tkc9y5%28v=VS.80%29.aspx) 也许?我从未使用过它,所以我对此并不完全确定。
  • 请不要将 PDB 与您的产品一起运送。
  • 哦,有 API 函数来列出 DLL 的导出方法吗?
  • 您可以使用命令行dumpbin /exports myname.dll 获取该信息。
  • 我想通过代码来实现 :)

标签: c++ windows debugging kernel32


【解决方案1】:

这与

的原因相同
GetThreadContext(hThread, lpContext);

有效。代码中使用的命名函数必须在链接时解析,否则链接将失败。无论您是使用& 获取他们的地址还是给他们打电话都没有关系。在运行时,DLL 被加载,然后函数名称解析为进程中的特定地址。

PDB 文件仅用于在调试期间提供增强的符号信息。通常,它们不会在运行时使用。

[我忍不住想我错过了这个问题的一些东西。如果这不是你的问题,请告诉我。]

【讨论】:

  • 我认为编译器需要什么与调试器如何解析符号令人困惑。尽管在这两种情况下,您仍然会从 .dll 中获得不带符号的正确值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 2010-11-12
  • 2013-12-16
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多