访问违规调试的乐趣

时间:2011-12-07 16:08:07

标签: c++ debugging memory pointers access-violation

我有一块c ++代码看起来像这个psuedocode:

LPBYTE FindBits(const BITMAPINFOHEADER *pbi)
{
    return (LPBYTE)pbi + pbi->biSize + FindColorTableBytes(pbi);
}

它获取指向实际dib(位图)数据的指针。

现在,我有一个多线程的c#应用程序,它从所有不同的文件(从理论上)加载位图,从来不是同一个。它使用我的C ++ DLL来处理从文档中读取和解码位图。

问题是我试图在多个线程上使这个库安全,但我在上面函数的行中得到一个AccessViolationError。在尝试调试此问题时,调试器会在发生错误时中断,我会查看pbi的成员。他们看起来像这样:

{biSize=??? biWidth=??? biHeight=??? ...}

pbi 使用GlobalLock(handleToDib)锁定的位图内存,甚至到达上述函数以获取访问冲突,GlobalLock必须返回非空指针。

当我查看内存窗口中GlobalLock返回的内存位置时,它看起来像这样:

  

?? ?? ?? ?? ?? ??

如果调试器给了我一个神奇的数字我可以理解内存是不是很糟糕......但这让我感到困惑......显然是调试器。有谁知道为什么调试器会显示这个?

1 个答案:

答案 0 :(得分:0)

MSVS调试器已经足够了 使用Memory窗口查看对象的原始结构,使用Disassembly窗口精确执行指令。

当然,OllyDbg可以更方便地完成这些任务(对于知道如何使用它的人来说),但它并不像MSVS的调试器那么容易。