控制调试目标执行非常有用,这与在Visual Studio中设置断点一样。
1、中断执行
中断执行可以使用组合键CTRL+C,这个组合键将使调试器把一个线程注入到目标进程中,并且执行一条中断语句。另外还可以通过设置断点实现。
2、恢复执行
当调试器中断执行时,(由于触发了断点或者其他事件),调试器会给出一个命令提示符,此时可以通过在命令提示符中输入命令来与调试目标进行交互。当完成了中断位置的分析后,希望恢复调试目标的执行可以使用命令g(go)。如果命令不带任何参数,那么只是恢复调试目标的执行。直到下次发生某个调试事件。
当通过Windbg启动一个程序时,调试器在启动程序后,会自动中断并进入到调试器。
如果启动一个.Net控制台程序ConsoleApplication3.exe,其代码如下:
namespace ConsoleApplication3 { class Program { static void Main(string[] args) { Console.WriteLine("程序启动!"); string str = Console.ReadLine(); Console.WriteLine("你刚才输入的是" + str); SayOver(); Console.ReadKey(); } public static void SayOver() { Console.WriteLine("程序结束!"); } } }
通过Windbg启动此控制台程序:
Microsoft (R) Windows Debugger Version 6.12.0002.633 X86
Copyright (c) Microsoft Corporation. All rights reserved.
CommandLine: "C:\Users\ChenZhuo\Documents\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\bin\Release\ConsoleApplication3.exe"
Symbol search path is: SRV*D:\PDB*http://msdl.microsoft.com/download/symbols/
Executable search path is:
ModLoad: 002a0000 002a8000 ConsoleApplication3.exe
ModLoad: 77100000 7723c000 ntdll.dll
ModLoad: 70bb0000 70bfa000 C:\Windows\SYSTEM32\MSCOREE.DLL
ModLoad: 759c0000 75a94000 C:\Windows\system32\KERNEL32.dll
ModLoad: 75510000 7555b000 C:\Windows\system32\KERNELBASE.dll
(fac.10a0): Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=00000000 ecx=0026f3d0 edx=771470f4 esi=fffffffe edi=00000000
eip=771a05a6 esp=0026f3ec ebp=0026f418 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!LdrpDoDebuggerBreak+0x2c:
771a05a6 cc int 3
触发初始断点是调试器的默认行为,这能给调试人员在最早时刻开始分析应用程序。此时调试目标会停止执行并等待输入。(对于我的程序,控制台上并无任何输出)。当输入命令g之后,控制台程序输出如下:
3、单步调试代码
通常,在调试器中分析代码时,我们可能需要单步调试代码,分别是命令p(step)和t(trace)。
用Windbg启动上面的控制台程序,第一次是系统默认的中断,我们执行命令g。此时,程序要求输入文字。这个时候,我们按住Ctrl+Break中断程序执行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2013-05-26 C# 特性(attribute)