【问题标题】:WinDbg get addresses of all functions from symbolsWinDbg 从符号中获取所有函数的地址
【发布时间】:2020-02-17 12:54:11
【问题描述】:

执行命令x ShittyProject!*我得到这样的输出

<MSIL:00250014         > ShittyProject!Main (void)
<MSIL:00250098         > ShittyProject!.ctor (void)
<MSIL:00250037         > ShittyProject!.ctor (void)
<MSIL:002500ed         > ShittyProject!get_Default (void)
<MSIL:002500a1         > ShittyProject!get_ResourceManager (void)
<MSIL:002500f8         > ShittyProject!.cctor (void)
<MSIL:0025002a         > ShittyProject!Foo (void)
<MSIL:0025006e         > ShittyProject!InitializeComponent (void)
<MSIL:00250000         > ShittyProject!InitializeComponent (void)
<MSIL:002500da         > ShittyProject!get_Culture (void)
<MSIL:002500e5         > ShittyProject!set_Culture (void)

如果我理解正确MSIL:* 它只是pdb 文件中的函数地址? 是否有可能以某种方式获取函数的地址以在其上放置断点?

【问题讨论】:

  • 在获得“正常”断点之前,代码需要进行 JIT 编译,这发生在您的应用程序首次执行时。您需要的是 sos.dll 的一部分,称为托管断点 !bpmd。见stackoverflow.com/questions/16774964/…
  • @AloisKraus,请提供我试过但调试器没有停止的示例。非常感谢。
  • !sos.bpmd 是执行此操作的常规(也是最简单)的方法。但是,如果该方法已经被 JITed,您可以手动在地址上放置一个断点,就像原生代码一样。例如,使用 !sos.name2ee ! 列出方法详细信息。如果 JITed,则给出实际地址。然后你可以做 bp 在上面下一个断点。

标签: c# windbg


【解决方案1】:

托管代码不同于本机代码。要以“本机方式”(bp) 设置断点,您需要等到该方法被 JIT 编译后,然后使用该方法的本机地址。

通常情况下,不会这样做,而是使用 .NET 特定的等效项。有SOS (Microsoft docs)!bpmdSOSEX(可能不再维护)!mbm

给定代码

using System;

namespace JittyProject
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("You want to stop before this shows up.");
            Console.ReadLine();
        }
    }
}

您想在初始断点处停止并告诉它等到加载 .NET,例如

0:000> sxe ld clr
0:000> g

加载 .NET 运行时后,您可以为 .NET 特定的调试命令加载 SOS 扩展。

0:000> .loadby sos clr

还有 SOSEX 扩展:

0:000> .load c:\wherever\SOSEX.dll

然后添加断点:

0:000> !mbm JittyProject.Program.Main

使用常规的g,你最终会遇到断点:

0:000> g
ModLoad: 76650000 766e2000   C:\Windows\SysWOW64\OLEAUT32.dll
Breakpoint: JIT notification received for method JittyProject.Program.Main() in AppDomain 00960db0.
Breakpoint set at JittyProject.Program.Main() in AppDomain 00960db0.
Breakpoint 2 hit

0:000> !clrstack
OS Thread Id: 0x3ff8 (0)
Child SP       IP Call Site
003eeda0 77601ffc [PrestubMethodFrame: 003eeda0] JittyProject.Program.Main() [C:\...\JittyProject\Program.cs @ 8]
003eef74 77601ffc [GCFrame: 003eef74] 

【讨论】:

  • 是否可以将函数的地址而不是名称传递给!bpmd?提前致谢。
  • @A191919: a) 不,我不知道如何使用 MSIL 地址来实现相同的目的 b) 我更改了答案,因为我无法在一次调试会话中重现 4 次排。 !bpmd 似乎不太可靠
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多