Kri*_*ler 30
我最喜欢的是命令.cmdtree <file>(未记录,但在之前的发行说明中引用).这可以帮助调出另一个窗口(可以停靠)以显示有用或常用的命令.这有助于提高用户使用该工具的工作效率.
最初在这里讨论,<file>参数的示例:http:
//blogs.msdn.com/debuggingtoolbox/archive/2008/09/17/special-command-execute-commands-from-a-customized-user-interface-与-cmdtree.aspx
示例: alt text http://blogs.msdn.com/photos/debuggingtoolbox/images/8954736/original.aspx
jtu*_*tte 26
调查崩溃转储中的内存泄漏(因为我更喜欢远程UMDH用于实时进程).策略是相同类型的对象都以相同的大小分配.
!heap -h 0命令提供给WinDbg的命令行版本cdb.exe(以获得更快的速度)以获取所有堆分配:Run Code Online (Sandbox Code Playgroud)"C:\Program Files\Debugging Tools for Windows\cdb.exe" -c "!heap -h 0;q" -z [DumpPath] > DumpHeapEntries.log
Run Code Online (Sandbox Code Playgroud)grep "busy ([[:alnum:]]\+)" DumpHeapEntries.log \ | gawk '{ str = $8; gsub(/\(|\)/, "", str); print "0x" str " 0x" $4 }' \ | sort \ | uniq -c \ | gawk '{ printf "%10.2f %10d %10d ( %s = %d )\n", $1*strtonum($3)/1024, $1, strtonum($3), $2, strtonum($2) }' \ | sort > DumpHeapEntriesStats.log
Run Code Online (Sandbox Code Playgroud)8489.52 707 12296 ( 0x3000 = 12288 ) 11894.28 5924 2056 ( 0x800 = 2048 ) 13222.66 846250 16 ( 0x2 = 2 ) 14120.41 602471 24 ( 0x2 = 2 ) 31539.30 2018515 16 ( 0x1 = 1 ) 38902.01 1659819 24 ( 0x1 = 1 ) 40856.38 817 51208 ( 0xc800 = 51200 ) 1196684.53 25529270 48 ( 0x24 = 36 )
dps命令在DumpHeapEntries.log中寻找一些0x24字节的堆分配,以了解占用所有内存的对象的类型.Run Code Online (Sandbox Code Playgroud)0:075> dps 3be7f7e8 3be7f7e8 00020006 3be7f7ec 090c01e7 3be7f7f0 0b40fe94 SomeDll!SomeType::`vftable' 3be7f7f4 00000000 3be7f7f8 00000000
这很俗气但它有效:)
dee*_*mok 19
当使用vtable查看堆栈中的C++对象时,以下命令非常方便,特别是在使用发布版本时,很多事情都会被优化掉.
dpp esp Range
能够加载任意PE文件作为转储是整洁的:
windbg -z mylib.dll
查询GetLastError():
!GLE
这有助于解码常见的错误代码:
!error error_number
小智 15
我每天使用的命令几乎有60%..
dv /i /t
?? this
kM (kinda undocumented) generates links to frames
.frame x
!analyze -v
!lmi
~
Run Code Online (Sandbox Code Playgroud)
Jef*_*ffJ 10
我经常使用的"提示"可以帮助您免于经常触摸那个讨厌的鼠标:Alt+1
Alt+ 1将焦点放在命令窗口中,以便您可以实际键入命令,以便向上箭头实际滚动命令历史记录.但是,如果您的焦点已经在可滚动命令历史记录中,则它不起作用.
Peeve:当焦点在源窗口时,为什么忽略了按键?这不像你可以编辑WinDbg内部的源代码.Alt+ 1救援.
一个词(好吧,好吧,三个):DML,即调试器标记语言.
这是WinDbg的一个相当新的补充,并没有在帮助文件中记录.但是,在Windows调试工具的安装目录中的"dml.doc"中有一些文档.
基本上,这是一种类似HTML的语法,您可以将其添加到调试器脚本中以进行格式化,更重要的是,链接.您可以使用链接调用其他脚本,甚至是相同的脚本.
我的日常工作涉及对元建模器的维护,该建模器为大型C++软件提供通用对象和对象之间的关系.首先,为了简化调试,我编写了一个简单的转储脚本,从这些对象中提取相关信息.
现在,使用DML,我已经能够添加到输出的链接,允许在相关对象上再次调用相同的脚本.这样可以更快地探索模型.
这是一个简化的例子.假设内省下的对象具有称为"引用"的关系到另一个对象.r @ $ t0 = $ arg1 $$ arg1是要检查的对象的地址
$$ dump some information from $t0
$$ allow the user to examine our reference
aS /x myref @@(&((<C++ type of the reference>*)@$t0)->reference )
.block { .printf /D "<link cmd=\"$$>a< <full path to this script> ${myref}\">dump Ref</link> " }
Run Code Online (Sandbox Code Playgroud)
显然,这是一个很好的实例,但这些东西对我来说真的非常宝贵.不是在非常复杂的对象中搜寻正确的数据成员(通常需要一分钟时间以及各种演员和解除引用的技巧),所以一切都可以通过一次点击自动完成!
小智 7
.prefer_dml 1
这会修改许多内置命令(例如lm),以显示DML输出,允许您单击链接而不是运行命令.非常方便......
.reload /f /o file.dll(/o将覆盖您拥有的符号的当前副本)
.enable_unicode 1//切换调试器默认的Unicode字符串,因为所有的Windows组件内部使用Unicode,这是非常方便的.
.ignore_missing_pages 1//如果您进行了大量的内核转储分析,您会看到很多关于内存被分页的错误.此命令将告诉调试器停止抛出此警告.
别名别名别名...
在调试器中节省一些时间.这是我的一些:
aS !p !process;
aS !t !thread;
aS .f .frame;
aS .p .process /p /r
aS .t .thread /p /r
aS dv dv /V /i /t //make dv do your favorite options by default
aS f !process 0 0 //f for find, e.g. f explorer.exe
Run Code Online (Sandbox Code Playgroud)