Windbg 将当前目录和命令行参数更改为CDB调试过程

Windbg 将当前目录和命令行参数更改为CDB调试过程,windbg,Windbg,我在大学和目前的工作中已经使用了gdb,但我需要学习如何在Windows上使用CDB和WinDBG进行开发。我更喜欢使用CDB,因为在Emacs中有一个很好的模式 启动CDB后如何更改当前目录?这很有用,因为当前目录默认为可执行目录(cdb C:/dev/myexe.exe将给出当前目录=C:/dev,尽管我从C:/testdir启动了cdb),但我可能在另一个驱动器上有一个测试目录,我更愿意将其用作工作目录。或者我可能有多个测试目录,我想在它们之间轻松切换,而不会丢失进程的断点。可以使用cd在

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

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

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

  • 在过去几周断断续续地搜索之后,我还没有找到这些问题的答案,我真的很想远离VisualStudio调试


    编辑:澄清了#1和#2

    好吧,这不像在GDB中那么容易,但在CDB中是可能的

    要更改工作目录并维护进程的断点,请告诉进程从何处启动,然后使用重新启动进程

    例如:

     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
    
    要使用不同的参数重新启动,请执行相同的操作,然后将新参数传递给命令


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

    您是否有机会使用它?根据注释,工作目录应该是您附加到的可执行文件,而不是cdb所在的位置。在那之后,我看不出有什么真正的问题,因为你可能总是要告诉它符号、源文件的位置。关于2。你想通过什么论点?如果您在cdb中保存工作区,它应该保存所有断点,这在WinDbg中肯定是正确的。我在猜测最后一点,因为我独家使用WinDbg#1。对于#2,假设我做了
    cdb myexe.exe arg1 arg2
    。在调试和设置断点之后,我意识到我应该指定一个额外的(但可选的)参数来重现bug。如果我在GDB中这样做,我可以发出
    r arg1 arg2 newarg3
    ,一切正常。在CDB中,如何使用新的命令行参数重新启动调试程序?不知道1。但是对于2。您可以创建一个包含参数的脚本文件,这将使用变量参数执行脚本