【问题标题】:Changing current directory and command line arguments to CDB debugging process将当前目录和命令行参数更改为 CDB 调试过程
【发布时间】:2016-10-09 04:50:33
【问题描述】:

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

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

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

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

编辑:澄清 #1 和 #2

【问题讨论】:

  • 您是否正在使用这个emacswiki.org/emacs/cdb-gud.el?根据 cmets,工作目录应该是您附加到的可执行文件,而不是 cdb 所在的位置。在那之后,我认为真的没有问题,因为您可能总是需要告诉它符号、源文件的位置。关于 2. 你想通过什么论点?如果您在 cdb 中保存工作区,它应该保存所有断点,这在 WinDbg 中肯定是正确的。我猜在最后一点,因为我只使用 WinDbg
  • 我澄清了#1。对于 #2,假设我执行 cdb myexe.exe arg1 arg2。在调试和设置断点之后,我意识到我应该指定一个额外的(但可选的)参数来重现错误。如果我在 GDB 中这样做,我可以发出 r arg1 arg2 newarg3 并且一切正常。在 CDB 中,如何使用新的命令行参数重新启动调试程序?
  • 不知道 1. 但是对于 2. 您可以创建一个带有参数msdn.microsoft.com/en-us/library/windows/hardware/… 的脚本文件,这将使用可变参数执行您的脚本

标签: windbg


【解决方案1】:

嗯,它不像在 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 命令。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-23
    • 2014-04-16
    • 2010-12-10
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多