2

我在大学和目前的工作中使用 gdb 完成了很多工作,但我需要学习如何在 Windows 上使用 CDB 和 WinDBG 进行开发。我更喜欢使用 CDB,因为 Emacs 中有一个很好的模式。

  1. 启动 CDB 后如何更改当前目录?这很有用,因为当前目录默认为可执行目录(cdb C:/dev/myexe.exe将给出当前 dir=c:/dev,尽管我从 启动了 cdb C:/testdir),但我可能在不同的驱动器上有一个测试目录,我更愿意将其用作工作目录。或者我可能有多个测试目录,我想在它们之间轻松切换,而不会丢失进程的断点。更改工作目录可以在 GDB 中使用cd. 在 CDB 中如何做到这一点?

  2. 假设我开始使用调试一个新进程,cdb my.exe arg1 arg2并且在设置断点和代码单步执行几分钟后,我意识到我应该指定一个额外的参数。在 GDB 中,我可以在运行进程时设置命令行参数 ( r arg1 arg2 newarg3 ...)。我的断点和工作区中的所有内容都保持不变。可以在 CDB 中做到这一点吗?看起来我需要保存工作区,使用调试过程的新参数重新启动 CDB,然后加载工作区以获取断点,这比发出运行命令要多得多。

在过去的几周里断断续续地搜索后,我还没有找到答案,我真的很想摆脱 Visual Studio 调试。

编辑:澄清#1和#2

4

1 回答 1

6

嗯,它不像在 GDB 中那么容易,但在 CDB 中是可能的。

要更改工作目录并维护断点,您必须.kill进程,使用.creatdir告诉它从哪里启动,然后使用.create重新启动进程。

例如:

 0:000> bp CreateFileW 
 0:000> bl  0 e 750316af     
 0001 (0001)  0:**** kernel32!CreateFileW 
 0:000> .kill 
 Terminated.  Exit thread and process events will occur.     
 0:000> .createdir d:\dev 
 Process creation dir: d:\dev 
 Process will inherit handles   
 0:000> .create c:\windows\system32\notepad.exe 
 CommandLine: c:\windows\system32\notepad.exe 
 Starting directory: d:\dev 
 Create will proceed with next execution 
 0:000> g 
 Symbol search path is: SRV*d:\symbols*http://msdl.microsoft.com/download/symbols 
 Executable search path is:  ModLoad: 00880000 008b0000   notepad.exe eax=00000000   
 ebx=00000000 ecx=25c50000 edx=0009dc08 esi=fffffffe edi=00000000 eip=774d0fac 
 esp=000df398 ebp=000df3c4 iopl=0         nv up ei pl zr na pe nc cs=0023  ss=002b  
 ds=002b  es=002b  fs=0053  gs=002b          efl=00000244 
 ntdll!LdrpDoDebuggerBreak+0x2d: 774d0fac 8975fc          mov     dword ptr [ebp-4],esi ss:002b:000df3c0=00000000 
 0:000> bl  0 e 750316af     
 0001 (0001)  0:**** kernel32!CreateFileW 
 0:000> g

要使用不同的参数重新启动,请执行相同的.kill 操作,然后将新参数传递给.create命令。

如果您要经常这样做,那么我会花一些时间编写一个脚本,使这个多步骤过程更容易。

于 2012-05-02T13:04:19.030 回答