在WinDbg调试器中暂停时调用C#方法?

在WinDbg调试器中暂停时调用C#方法?,windbg,sos,Windbg,Sos,使用WinDbg调试C#应用程序时,我知道如何使用列出特定类型的对象!转储堆。例如: !dumpheap -stat -type CefSharp.Wpf.ChromiumWebBrowser Statistics: MT Count TotalSize Class Name 00007ffa08364978 1 32 CefSharp.Wpf.ChromiumWebBrowser+<>c__DisplayC

使用WinDbg调试C#应用程序时,我知道如何使用
列出特定类型的对象!转储堆
。例如:

!dumpheap -stat -type CefSharp.Wpf.ChromiumWebBrowser

Statistics:
              MT    Count    TotalSize Class Name
00007ffa08364978        1           32 CefSharp.Wpf.ChromiumWebBrowser+<>c__DisplayClass1f
00007ffa08336f48        1           32 CefSharp.Wpf.ChromiumWebBrowser+<>c__DisplayClass22
00007ffa0833fa18        2           64 CefSharp.Wpf.ChromiumWebBrowser+<>c__DisplayClass25
00007ffa08364748        4          128 CefSharp.Wpf.ChromiumWebBrowser+<>c__DisplayClass28
00007ffa083123c0        1          824 CefSharp.Wpf.ChromiumWebBrowser
00007ffa08361fe0      115         3680 CefSharp.Wpf.ChromiumWebBrowser+<>c__DisplayClass10
!dumpheap-stat-type CefSharp.Wpf.ChromiumWebBrowser
统计数字:
MT Count TotalSize类名称
00007ffa08364978 1 32 CefSharp.Wpf.ChromiumWebBrowser+c__显示类别1f
00007ffa08336f48 1 32 CefSharp.Wpf.ChromiumWebBrowser+c__DisplayClass22
00007ffa0833fa18 2 64 CefSharp.Wpf.ChromiumWebBrowser+c__显示类25
00007ffa08364748 4 128 CefSharp.Wpf.ChromiumWebBrowser+c__显示类28
00007ffa083123c0 1 824 CefSharp.Wpf.ChromiumWebBrowser
00007ffa08361fe0 115 3680 CefSharp.Wpf.ChromiumWebBrowser+c__显示类别10

现在,我想知道是否可以使用WinDbg执行其中一个对象的方法。例如,我知道这个对象有一个
ShowDevTools()
方法,我如何执行它呢?

TLDR:直到现在我才看到它工作。A自2011年以来一直没有答案。如果这很容易实现的话,一些聪明的人,比如史蒂夫·约翰逊(SOSEX的作者),可能已经在一个扩展中实现了这一点。netext中也没有这样的命令。最接近的是,但它仅对成员有效


当您现在有了对象列表时,首先需要找到这些对象上可用的方法:

!dumpmt -md <MT column from !dumpheap>
从那里,您可以得到一个本机代码地址,该地址可能用于
.call
。不幸的是,下一个问题出现了:

0:006> .call 011f0500
                ^ Couldn't resolve '.call 011f0500'
此错误消息表示WinDbg无法解析该方法的符号。虽然DLL有PDB,但JIT编译器不会为JIT代码生成PDB

因此,您需要指定文档中定义的原型:

.call /s Prototype Function( Arguments )
允许您调用由函数指定的函数,即使您没有正确的符号。在这种情况下,您必须具有另一个函数的符号,该函数与您尝试调用的函数具有相同的调用原型

在这一点上,我们有以下开放性问题:

  • 我从哪里得到一个好的原型
  • 如果方法没有JIT,我该怎么办

很抱歉,这个“答案”不能解决您的问题。它可能只会让我们了解情况有多困难。

相关,可能重复,但尚未回答:
.call /s Prototype Function( Arguments )