wenmo8 发布的文章

简介

STATUS_IMAGE_CHECKSUM_MISMATCH表明应用程序或DLL已经损坏。值为0xC0000221。其定义如下:

//
// MessageId: STATUS_IMAGE_CHECKSUM_MISMATCH
//
// MessageText:
//
// {Bad Image Checksum}
// The image %hs is possibly corrupt. The header checksum does not match the computed checksum.
//
#define STATUS_IMAGE_CHECKSUM_MISMATCH   ((NTSTATUS)0xC0000221L)

说明

检查程序或其他系统文件中出现严重错误。 文件头校验和与预期的校验和不匹配。这也可能是由文件的 i/o 路径中的硬件错误 (磁盘错误、有故障的 RAM 或损坏的页面文件) 导致的

在调试的过程中,我们很有可能需要知道某个类或结构体的大小,有哪些方式方法呢?

其一,用dx指令观察类型实例,它会列出成员和每个成员的大小,自己计算,比如

 

自己根据类型信息和内存对齐去计算,如果成员是其他复杂的结构,不清楚的话难计算,另外,不知道对齐规则,会算错。所以这样很麻烦。

其二、用dt -v指令,它会直接给出大小

 

其三、上面的指令已经很体贴了,可是如果你是C/C++程序员,可能你会更喜欢??sizeof

 

1、"windbg ANSI Command Tree 1.0"前不能有空格,或空行

2、cmdtree这个窗口的标题 title紧接着一对{""},比如title {"dump analyze"}。一定注意title和后面的内容是分离的,不要写成:title{"dump analyze"}。为了规避这个问题,你可以换行

  title

  {"dump analyze"}

3、"windbg ANSI Command Tree 1.0"和title之间可以有空行,但不能有其他任何内容

4、title后必须有其他元素,否则加载失败

5、注意正文前面的空格,子级的空格一定要比上一级多。一个子级只能比上一级多一个空格,两个都会报错!

当我们调试时,某些情况下,我们需要专门针对crt堆进行分析,但,我们知道进程里可能有多个堆,比如

 

你说哪个是crt堆?

如果你跟踪过crt的代码,那么这个问题就好办了,crt堆是通过msvcrt!_heap_init来分配初始化的,在_heap_init里把crt堆的句柄给了变量_crtheap,所以我们只要看这个变量的值即可,如下

 

即Address=0xfe0000的堆就是该进程的crt堆。