B、眼见为实
在【眼见为实】这个章节里,有些调试动作是一样的,我就不每个节点都写了。我就写在这里了。首先编译好自己的项目,根据自己的喜好,可以切换到编译项目目次下,也可以直接输入项目所在目次,接着就可以举行项目调试了。我使用的命令行工具是【Developer Command Prompt for VS 2022】。
如果没有指定任何参数,只能显示一组可用的选项。我们将我们的项目完备路径和项目名称作为输入参数。执行【ntsd E:\Visual Studio 2022\Source\Projects\AdvancedDebug.NetFramework.Test\ExampleCore_3_1_1\bin\Debug\net8.0\ExampleCore_3_1_1.exe】,弹出新窗口,如图:
新的 NTSD 窗口,如图:
上面这个截图分三个部分:第一部分是符号文件搜索路径,如图:
第二部分:加载的所有模块,表示应用步伐所需要的模块都已经加载完毕。如图:
第三部分:停止指令异常。每当调试器启动一个进程大概调试器附加到一个进程的时候,调试器都会注入一个停止指令,这条指令将使调试目的停止运行。断点指令的作用:使用户与调试器和调试目的举行交互。这里是 int 3 停止。如图:
公有符号文件:这类型的符号文件只是有选择的包含了一些符号信息,这会使调试工作困难一点。比如:在 Microsoft 符号服务器上存储了一些公有符号文件。每当将调试器指向 Microsoft 符号服务器时,都可以下载这些符号文件,并在调试会话中使用它们。
之所以有【私有符号文件】和【公有符号文件】之分,主要是为了保护知识产权。私有符号中包含大量底层技术信息,就很容易对应用步伐举行逆向工程。公有符号就不存在如许的问题,既可以调试,又不会泄露核心技术信息。
如果我们使用 -G 命令开关,执行命令【ntsd -G E:\Visual Studio 2022\Source\Projects\AdvancedDebug.NetFramework.Test\ExampleCore_3_1_2\bin\Debug\net8.0\ExampleCore_3_1_2.exe】,调试器在初始会停止执行。如图:
如果没有使用 -G 命令开关,我们还需要输入命令才气退出。
3.3.3、单步调试代码
我们使用过 VS IDE 的调试功能,快捷键有:F10,F11,F9等,调试器也为我们提供了类似的命令。但是,需要注意:如果在调试托管代码时使用非托管调试器,那么通常是对 JIT 编译器产生的机器代码举行单步调试。 A、知识介绍 1)、p 命令 p(step):命令其实就是 VS 中的 f10 快捷键,单步执行,遇到函数也是当成一条指令执行,不会进入函数体。 2)、t 命令 t(trace):命令其实就是 VS 的 f11 快捷键,它是一种进入函数的单步执行调试。 3)、pc 命令 pc(Step to Next Call) 就是不停运行直到遇到 call 为止,不会进入函数体,call 是一个函数调用,汇编指令。 4)、tc 命令
tc(Trace to Next Call) 和 pc 不同的是,tc 会进入方法体,直到遇到 call 为止。 5)、pt 命令
pt(Step to Next Return) 如果有方法会进入方法内部递归处理,遇到下一个 ret 为止。 6)、tt 命令
tt(Trace to Next Return) 会进入函数体直到遇到 ret 为止。递归的意思。