在.NET程序集中查找字节偏移量

时间:2011-02-03 12:33:17

标签: .net

我正在尝试调试客户端向我们报告的错误。堆栈跟踪只有字节偏移,而不是行号。

e.g。

  

[NullReferenceException:对象引用未设置为对象的实例。]
     Foo.Bar(FooFoo p)+32
     Foo.BarBar()+191
     Foo.BarBarBar()+ 15

如何将这些字节偏移反向设计为代码/方法调用等?

如何找到抛出NullReferenceException的位置?

3 个答案:

答案 0 :(得分:5)

这是一个可能有效(或可能不是:)的解决方案。问题是偏移和行号之间的映射包含在pdb(又称调试符号)

  1. 完全(重要)与用于将二进制文件发送到客户端的构建配置相同。然后转到项目属性,选项卡“构建”,单击页面底部的“高级”按钮。然后找到“Debug Info”并选择“pdb-only”
  2. 构建项目并转到输出文件夹。
  3. 选择ildasm,将其添加到PATH或将其复制到某处。
  4. 在您的构建文件夹中执行ildasm /LINENUM /SOURCE YourFile.exe。它将输出带有偏移和源线映射的IL。
  5. 我看到的唯一问题是您无法生成完全相同的二进制文件和映射可能会发生变化。

答案 1 :(得分:3)

我唯一能记住的工具就是.NET Reflector。打开与客户端在其中完全相同的二进制文件,并将“选项”对话框中的语言更改为IL,并且它应显示(AFAIK)与每行上的标签相同的字节偏移量。

你必须阅读IL而不是C#或其他任何东西,但它总比没有好。

答案 2 :(得分:3)

  1. 在visual studio中打开您的项目
  2. 将断点放在Foo.Bar(FooFoo p)
  3. 编译并开始调试。执行将调用Foo.Bar(FooFoo p)的操作。请注意,您需要使用用于生成客户端程序集的配置(因为优化),当然还有相同的源代码
  4. 打开“调用堆栈”窗口,右键单击并启用“显示字节偏移”并禁用“显示行号”
  5. 逐步执行功能,直到您点击“MyAssembly.dll!MyProject.Something.Foo.Bar(FooFoo p)+ 0x32 bytes”(或“+ 0x20 bytes”,如果您的偏移十进制数字)
  6. 编辑:Andreys解决方案可能更好:)