分类 调试 下的文章

假设有一种情况,您从客户那里得到一个内存转储,需要模块(DLL、EXE、OCX等)来进一步调试。。(.NET模块可用于通过反向工程查看源代码。)
我们可以使用windbg目录中的clr10\sos.dll保存所有模块(在获取内存转储时由目标进程加载)。有趣的是,sos.dll不仅可以提取托管模块,还可以保存所有本机/非托管模块!

先加载sos模块

 

然后用!sam <path> OR !SaveAllModule <path> 提取特定磁盘位置上的模块。

 

像/analyze这样的静态分析工具必须在报告警告时过于激进(导致过多的误报)和过于胆小(导致过多的误报)之间保持微妙的平衡。我不能分析这些错误,因为我不能分析这些错误。这两个警告在使用gcc生成时都会显示,但在使用visualstudio的/analyze时则不会显示。

返回局部变量地址

第一个很清楚。它与返回局部变量地址的严重错误有关。考虑以下代码:

    const char*GetName1()
{
char name[100];
strcpy_s( name, “This
isa name” );//warning C4172: returning address of local variable or temporary returnname;
}

分析是一种强大的VisualC++特性,可以帮助发现bug。然而,它使用了一些相当奇特的启发式方法,这使得很难决定如何认真对待它的警告。今天我们将讨论其中一种特殊的启发式方法,并展示一个案例,其中/analyze是完全错误的。这些特殊的警告大多在VS2012中修复。在我与微软分享的repro项目中,大多数错误警告都是被处理的,所以假阳性率较低。这些测试都是用Visual Studio 2010 SP1,C/C++优化编译器版本16.00 .40219.01为80×86。

我发现在代码中使用win32api时,需要多次监视最后一个win32错误!(在每次使用API后调用GetLastError()是不可行的解决方案!).. 在Visual Studio中,它们提供了一个非常好的小特性。你可以在“监视”窗口中写入@err,hr

同样,您可以使用另一个伪寄存器@eax来监视函数返回值!(如果您正在查看某些Win32 API的返回值,也可以执行@eax,hr来查找整数后面的文本消息。)