2011-02-03 42 views
8

我正在尝试调试客户端向我们报告的错误。堆栈跟踪只有字节偏移量,而不是行数。在.NET程序集中查找字节偏移量

例如

[NullReferenceException异常:对象引用不设置为一个对象的一个​​实例]
Foo.Bar(FooFoo P)32
Foo.BarBar()191
Foo.BarBarBar()15

如何反向工程这些字节偏移到代码/方法调用等行?

我如何才能找到其中的NullReferenceException被抛出?

+3

可能会更好应用程序调试符号,这将产生线,而不是在堆栈跟踪偏移 – Andrey 2011-02-03 12:36:33

+1

如果您启用优化编译不太容易 – 2011-02-03 12:39:59

+0

+1,没有理由调试symbolos不编译即使不运行生活,这你可以将它们发送到客户端 – TomTom 2011-02-03 12:40:24

回答

4

这是可能的工作(或者可以不:))的解决方案。的问题是,偏移量和行号之间的映射被包含在PDB(又名调试符号)

  1. 采取恰好(重要)相同构建配置为用于船舶二进制到客户端的一个。然后转到项目属性,选项卡“Build”,单击页面底部的“Advanced”按钮。然后找到“Debug Info”并选择“pdb-only”
  2. 构建项目并转到输出文件夹。
  3. 选择ildasm,要么将它添加到PATH或其他地方复制。
  4. 在您的生成文件夹中执行ildasm /LINENUM /SOURCE YourFile.exe。它将输出具有偏移和源线映射的IL。

唯一的问题,我看到你不能生产刚好相同的二进制文件和映射可能会波动。

3

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

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

3
  1. 在Visual Studio中打开项目上Foo.Bar(FooFoo P)
  2. 认沽断点
  3. 编译并开始调试。执行将调用Foo.Bar(FooFoo p)的操作。请注意,您需要使用用于生产,当然同样的源代码
  4. 打开调用堆栈窗口(因为优化的)客户端组件配置,右键单击并启用“显示字节偏移”和禁用“显示行号”
  5. 单步执行功能,直到你点击“MyAssembly.dll!MyProject.Something.Foo”。酒吧(FooFoo P)+ 0x32字节”(或 “+ 0×20字节”,如果你的偏移十进制数)

编辑:Andreys的解决方案是在未来可运送寿:)