2023年1月

.dumpcab (Create Dump File CAB)

.dumpcab命令创建一个包含当前dump文件的CAB文件。

语法

.dumpcab [-aCabName 

参数

-a
使得当前加载的符号也包含在CAB文件中。对于minidump,所有以加载的映像也会包含进去。使用lml来查看加载了哪些符号和映像。
CabName
包含扩展名的CAB文件名。CabName 可以包含绝对或者相对路径;相对路径是相对于调试器启动的目录的。建议使用.cab扩展名。

环境

模式 用户模式、内核模式
目标 活动目标、崩溃转储
平台 所有

注释

该命令只有在调试dump文件时可以使用。(这句话似乎和前面的表格有冲突。—译者注)

如果在调试活动目标时想创建CAB中的dump文件,需要使用.dump (Create Dump File)命令。然后,打开一个使用该dump文件作为目标的新的调试会话,然后再使用.dumpcab

.dumpcab命令不能将多个dump文件放入一个CAB文件中。

.f+, .f- (Shift Local Context)

.f+ 命令将帧序号移动到当前堆栈中的下一帧。.f- 命令将帧序号移动到当前堆栈中的上一帧。

语法

.f+  
.f-  

环境

模式 用户模式、内核模式
目标 活动目标、崩溃转储
平台 所有

 

注释

(frame)用来指定调试器用来解析局部变量的局部上下文(作用域)。

.f+.f-
命令是用来在当前调用堆栈中移动到下一帧或者前一帧的快捷方式。这些命令和下面的.frame
命令作用相同,但是.f 要更短更方便:

  • .f+.frame @$frame + 1一样。
  • .f-.frame @$frame - 1一样。

美元符号($)表示帧的值是一个伪寄存器。At符号(@)使得调试器访问该值更快,因为它告诉调试器后面的字符串是一个寄存器或者伪寄存器。

程序运行时,局部变量的意义由程序计数器的位置决定,因为这些变量的作用域仅在定义它们的函数内部。如果没有使用.f+.f-
命令(或者 .frame 命令),调试器会使用当前函数(调用堆栈中的当前帧)的作用域作为局部上下文。

帧序号(frame number)是堆栈帧在堆栈回溯中的位置。可以使用k, kb, kd, kp, kP, kv (Display Stack Backtrace)命令或者Calls
窗口查看堆栈回溯。第一行 (当前帧) 的帧序号是0。后面的行分别是1、2、3等等。

可以将局部上下文设置到另一个堆栈帧来查看新的局部变量信息。但是,实际可用的变量由执行的代码决定。

如果又对程序进行执行,调试器会将局部上下文重置为程序计数器的作用域。如果寄存器上下文改变,局部上下文也重置到调用堆栈顶部的帧。

微软符号服务器已经很久没ping通了,挂上全局代理可以下载符号,但是又不想总是开着全局代理。

后来找到一种替代方案,可以通过设置系统环境变量,来让下载符号的流量走代理服务器

_NT_SYMBOL_PROXY

 

 

 

无论是否有异常处理,用任何语言编写良好的错误处理代码都是困难的。当我考虑在一个给定的程序中需要实现什么样的异常处理时,我首先将可能捕获的每个异常分类到四个bucket中的一个,我将其标记为致命的、硬骨头般突出的、烦人的、外部的。

致命的异常不是你的错,你不能阻止它们,你也不能理智地清除它们。它们几乎总是发生,因为这一进程病入膏肓,即将摆脱痛苦。内存不足、线程中止等。捕捉这些是毫无意义的,因为你的用户代码所能做的一切都不能解决问题。就让你的“finally”块运行,并希望最好的。(或者,如果你真的很担心,快速失败和不让;在这一点上“finally”块运行,它们可能只会让事情变得更糟。但这是另一话题。)

硬骨头般突出的异常是您自己的该死的错误,您可以阻止它们,因此它们是代码中的错误。你不应该捕获它们;这样做是在你的代码中隐藏了一个错误。相反,您应该改写您的代码,这样就不可能在第一时间发生异常,因此不需要捕获异常。这个参数是空的,类型转换是坏的,索引超出范围,你试图除以零-这些都是你本来可以很容易地避免的问题,所以首先要防止混乱,而不是试图捕获它。

令人烦恼的异常是不幸的设计决策的结果。恼人的异常是在完全非异常的情况下抛出的,因此必须一直捕获和处理。典型的异常例子是Int32.Parse,如果给它一个不能被解析为整数的字符串,它就会抛出。但是这个方法99%的用例是转换用户输入的字符串,这可能是任何旧的东西,因此解析失败也不例外。更糟糕的是,如果不实现整个方法本身,调用者就无法提前确定其参数是否糟糕,在这种情况下,他们不需要首先调用它。这个不幸的设计决策非常令人恼火,当然,框架团队随后不久就实现了TryParse,这是正确的做法。你必须抓住令人恼火的异常,但这样做是令人恼火的。试着永远不要自己写一个抛出令人烦恼的例外的库。

最后,外部异常看起来有点像恼人的异常,只是它们不是不幸的设计选择的结果。相反,它们是凌乱的外部现实影响到你美丽、清晰的程序逻辑的结果。考虑这个伪C#代码,例如:

try
{
using ( File f = OpenFile(filename, ForReading) )
{
// Blah blah blah
}
}
catch (FileNotFoundException)
{
// Handle filename not found
}

使用WinDgb调试的时候,我们需要和各种结构体等符号打交道。包括系统的符号等等。有时候符号太多了,我们根本记不住或者只有模糊的印象,比如只记得其中的2个字母,怎么办?或者知道符号名,但不知道在哪个模块,特别是使用stl库的时候。这时候dt搜索就可以帮上忙了。
使用如下通配符命令即可列出所有的符号

dt  *!*XXX*  xxx为我们知道的仅有符号名字符

例如:

0:006> dt  *!*filesystem_error*
          xxx!filesystem_error
          xxx!std::tr2::sys::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >
          xxx!std::tr2::sys::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >
          MSVCP120!filesystem_error
          MSVCP120!std::tr2::sys::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >
          MSVCP120!std::tr2::sys::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >
          YYY!filesystem_error
          YYY!std::tr2::sys::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >
          YYY!std::tr2::sys::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >
105139e0  xxx!std::tr2::sys::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >
10513950  xxx!std::tr2::sys::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >
10514130  xxx!std::tr2::sys::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >::~basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >
10514d10  xxx!std::tr2::sys::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >::`scalar deleting destructor'
0f9c4140  YYY!std::tr2::sys::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >
0f9c05e0  YYY!std::tr2::sys::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >
0f9c4190  YYY!std::tr2::sys::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >::~basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >
0f9c0690  YYY!std::tr2::sys::basic_filesystem_error<std::tr2::sys::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::tr2::sys::path_traits> >::`scalar deleting destructor'