【发布时间】: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 在上面下一个断点。