我在大学和目前的工作中使用gdb进行了很多工作,但我需要学习如何在Windows上使用CDB和WinDBG进行开发.我更喜欢使用CDB,因为在Emacs中有一个很好的模式.
如何在启动CDB后更改当前目录?这很有用,因为当前目录默认为可执行目录(cdb C:/dev/myexe.exe虽然我从中启动了cdb C:/testdir,但是会给出当前的dir = c:/ dev ),但我可能在不同的驱动器上有一个测试目录,我更喜欢使用它工作目录.或者我可能有多个测试目录,我想在不丢失进程断点的情况下轻松切换它们.更改工作目录可以使用GDB在GDB中完成cd.如何在国家开发银行完成这项工作?
假设我cdb my.exe arg1 arg2在设置断点和代码步进几分钟后开始调试一个新进程,我意识到我应该指定一个额外的参数.在GDB中,每当我运行process(r arg1 arg2 newarg3 ...)时,我都可以设置命令行参数.我的断点和工作区中的所有内容都保持不变.在CDB可以做到这一点吗?看起来我需要保存工作区,使用调试过程的新参数重新启动CDB,然后加载工作区以获取断点,这比发出运行命令要多得多.
在过去几周搜索和关闭之后,我没有找到这些答案,我真的想摆脱Visual Studio的调试.
编辑:澄清#1和#2
小智 5
嗯,它不像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
Run Code Online (Sandbox Code Playgroud)
要使用不同的参数重新启动,请执行相同的.kill,然后将新参数传递给.create命令.
如果你要做很多事情,那么我会花一些时间编写一个脚本,使这个多步骤过程更容易.