使用反编译资源调试跌落测试(由于第三方库中的异常而跌落)。没有错误文本,只有堆栈跟踪。异常本身是自定义库,因此对其性质也一无所知。我正在尝试从引发异常的第三方库中调试以下方法,以了解那里发生的情况:
public Engine Execute(Program program)
{
this.ResetStatementsCount();
this.ResetTimeoutTicks();
this.ResetLastStatement();
this.ResetCallStack();
using (new StrictModeScope(this.Options._IsStrict || program.Strict, false))
{
this.DeclarationBindingInstantiation(DeclarationBindingType.GlobalCode, program.FunctionDeclarations, program.VariableDeclarations, (FunctionInstance) null, (JsValue[]) null);
Completion completion = this._statements.ExecuteProgram(program);
if (completion.Type == Completion.Throw)
throw new JavaScriptException(completion.GetValueOrDefault()) { Location = completion.Location };
this._completionValue = completion.GetValueOrDefault();
}
return this;
}
断点只在不包含在块中的行上设置和触发,using当你尝试在运行时设置断点时,using里面会出现一个提示,这个地方不能设置断点。如果断点是在启动之前设置的,那么它根本不起作用。
问题是什么?
一个类似的问题,但对于不同版本的 Visual Studio 被问到英文 SO: Breakpoint Failed to Bind - Visual Studio 2015。这个问题得到了很多答案。我在这里赞成这个答案,因为过去有一个类似的解决方案对我有帮助。
在将字节码编译为本机 JIT 代码时,编译器可能会执行一些转换以优化性能。这些转换通常会干扰代码的调试,并且在项目以调试模式构建时会被禁用。
Visual Studio 2017 提供了一个选项来关闭优化,即使在调试在发布模式下构建的代码时也是如此。为此,只需在设置中启用Suppress JIT optimization on module load选项。
另外,你可以试试这个技巧。在最近的地方设置一个断点,切换到反汇编模式,并用 F11 键单步执行代码(输入函数),以免跳过所需的代码。此处描述了此技术:调试优化代码。