【发布时间】:2010-04-27 10:35:02
【问题描述】:
如何自动化调试过程?
我有一个带有一些基本命令的 WinDbg 脚本,当我附加到 WinDbg 的进程/应用程序中发生中断 时,我想运行这些命令。 如何知道WinDbg有中断,如何自动启动脚本?
【问题讨论】:
如何自动化调试过程?
我有一个带有一些基本命令的 WinDbg 脚本,当我附加到 WinDbg 的进程/应用程序中发生中断 时,我想运行这些命令。 如何知道WinDbg有中断,如何自动启动脚本?
【问题讨论】:
您可以在设置断点时使用命令字符串选项来运行任何 windbg 命令。让它运行你的脚本。
类似:
bp <address to set break> "$$><c:\\temp\\dbgscript.txt;g"
如果您的意思是“抛出异常时”和“进程中发生中断时”,我相信您应该能够使用 sx 命令执行相同的操作。
【讨论】:
Python 示例:
from pykd import *
def bpCallback():
if is64bitSystem():
objAttr = typedVar( "ntdll", "_OBJECT_ATTRIBUTES", reg("r8") )
else:
objAttr = typedVar( "ntdll", "_OBJECT_ATTRIBUTES", ptrPtr(reg("esp") + 0xC) )
name = loadUnicodeString( objAttr.ObjectName )
dprintln( "NtCreateFile: " + name )
return DEBUG_STATUS_GO_HANDLED
if not isWindbgExt():
startProcess("notepad.exe")
if not isDumpAnalyzing() and not isKernelDebugging():
nt = loadModule("ntdll")
b1 = bp( nt.NtCreateFile, bpCallback )
# wait for user break, exceptions or process exit
go()
dprintln( "stopped" )
else:
dprintln( "The debugger must be connected to live usermode process" )
windbg 的 Python 扩展可在此处获得: pykd.codeplex.com
【讨论】:
您是在运行已附加windbg 的应用程序,还是在进行JIT 调试?如果是后者(即,您依赖于 HKLM\Softare\Microsoft\Windows NT\AEDebug\Debugger 中的设置),则只需修改 Debugger 键的值以使用“-c”命令在之后运行命令调试器附加。
假设是前者,那么您可以尝试使用命名管道或 tcp(使用 .server 命令)启动调试服务器。然后,您可以编写一个控制台应用程序来启动一个 cdb 实例作为客户端连接到上述的 windbg 服务器并让应用程序解析标准输出,直到您看到调试器提示。然后,您可以从那时起有效地自动化调试会话。因此,它减少了解析练习,可能包含在 FSM 中,具体取决于您想要获得的复杂程度。
【讨论】: