WinDbg和.Net x64程序集:在C#源中命中断点的分步演练

WinDbg和.Net x64程序集:在C#源中命中断点的分步演练,c#,.net,debugging,windbg,C#,.net,Debugging,Windbg,在C#Forms应用程序中使用WinDbg跟踪简单对象引用时,我遇到了非常困难的情况。 我找到了克里斯·洛维特(Chris Lovett)的一首非常好的芭蕾舞曲:在VS‘即时窗口’中使用“SOS” 不幸的是,我正在调试一个x64应用程序,将我的应用程序重新编译为32位会使我愿意重新创建的测试条件产生偏差尝试在x64部件中加载SOS,结果与预期一样,出现以下错误: 命令执行期间出错:无法加载扩展名C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos

在C#Forms应用程序中使用WinDbg跟踪简单对象引用时,我遇到了非常困难的情况。 我找到了克里斯·洛维特(Chris Lovett)的一首非常好的芭蕾舞曲:在VS‘即时窗口’中使用“SOS”
不幸的是,我正在调试一个x64应用程序,将我的应用程序重新编译为32位会使我愿意重新创建的测试条件产生偏差

尝试在x64部件中加载SOS,结果与预期一样,出现以下错误:

命令执行期间出错:无法加载扩展名C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll(错误193)

因此,正如WinDbg似乎管理x64一样,这是我要走的路。
然而,让它与托管代码一起工作并不是一项简单的任务。
在附加的源代码中放置一个简单断点会导致以下错误:

无法在00000000 010e000f插入断点0,Win32错误0n998

“对内存位置的访问无效。”


这与Naveen Srinivasan.在他的
但是,当我尝试使用同一网页中建议的“sxe ld”/.loadby sos”/.loadsosex”解决方案时,我得到了以下错误:

调用LoadLibrary(sos)失败,Win32错误0n2

系统找不到指定的文件。


因此,我猜后面的命令也与SOS相关

我也试着跟随一篇较老的文章,其中详细解释了如何在WinDbg中为托管代码设置断点。但我怀疑他使用的name2ee命令是特定于“SOS”的,因此在我的情况下它相当不可用(我遇到了类似的LoadLibrary错误)

我在这里真的很困惑和无助。我觉得无论我朝哪个方向走,我都会撞到墙上。我离放弃并重新编译整个应用程序到32位进行调试还有两英寸的距离,因为我已经为此损失了近2个工作日

所有这些只是我想要实现的第一步,那就是使用gcroot在更复杂的应用程序中跟踪对“Trackee”对象的所有引用

谢谢你的帮助



虚拟示例代码:DebugTest.cs:


5-然后在执行
加载vgcroot
!vgcroot 000000000 2bd33e0 C:\graph.dgml
之后,我能够找到并可视化对我的跟踪对象的所有引用。

您尝试过吗?.loadby sos.dll clr“加载SOS?铱星:万岁!我终于得到了十六进制输出的东西,我不明白:-)那么CLR技巧做什么呢?接下来要做什么来放置断点和跟踪“跟踪对象”对象引用?我现在设法遵循了Eran Sandler的帖子,但在最后一步我得到了一个Acces Viloation错误“诀窍”很简单:loadby sos.dll clr的意思。从进程加载clr.dll的同一目录加载sos.dll。没有魔法。好吧,我同意,但这似乎与本博客的x64部分相矛盾:一个其他人,说SOS不是x64友好的。这很让人困惑。米卡,答案真的属于答案部分,在你的问题中嵌入答案会让你更难找到和参与。您可以回答自己的问题,但强烈建议您先给其他人一个公平的机会。您是否尝试过使用“.loadby sos.dll clr”加载sos?@Iridium:Hooray!我终于得到了十六进制输出的东西,我不明白:-)那么CLR技巧做什么呢?接下来要做什么来放置断点和跟踪“跟踪对象”对象引用?我现在设法遵循了Eran Sandler的帖子,但在最后一步我得到了一个Acces Viloation错误“诀窍”很简单:loadby sos.dll clr的意思。从进程加载clr.dll的同一目录加载sos.dll。没有魔法。好吧,我同意,但这似乎与本博客的x64部分相矛盾:一个其他人,说SOS不是x64友好的。这很让人困惑。米卡,答案真的属于答案部分,在你的问题中嵌入答案会让你更难找到和参与。你可以回答自己的问题,但强烈鼓励你先给别人一个公平的机会。
namespace DebugTest
{    
    public partial class Form1 : Form
    {
        String Trackee;
        public Form1()
        {
            InitializeComponent();
            Trackee = "Where is Charlie";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = Trackee; // << Trying to put a breakpoint here
        }
    }
}
  Address               MT              Size
0000000002bd33e0 000007ff000581d0       24