AccessViolation调试有趣
AccessViolation debugging fun
本文关键字:调试 AccessViolation 更新时间:2023-10-16
我有一个c++代码块,看起来像这样
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返回的内存位置时,它看起来是这样的:
? ??? ?? ?? ?? ??
如果调试器给我一个神奇的数字,我可以理解如果内存不好…但这让我很困惑……显然还有调试器。有人知道调试器为什么显示这个吗?
MSVS调试器已经足够好了。
使用内存窗口查看对象的原始结构,使用反汇编窗口精确执行指令。
当然OllyDbg可以更方便地完成这样的任务(对于知道如何使用它的人),但它不像MSVS的调试器那么容易。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 在linux上调试巨大的C++项目
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 正在VS调试器中监视映射条目
- 使用调试/崩溃报告将应用程序部署到客户端
- VC++本机单元测试,找不到调试符号
- 如何在C++生成器中禁用"使用调试.dcus"
- 使用vscode调试时,GDB意外退出
- 即使使用调试编译标志,表达式也是"optimized out"
- 调试 CUDA MMU 故障
- 小字符串优化(调试与发布模式)
- 调试和自由执行中的信号处理
- 调试编译的服务器在数据库打开时崩溃
- Visual Studio 调试优化如何工作?
- 如何配置Visual Studio Code以使用cygwin,cmake和gcc进行调试
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 如何在大型c++项目的可视化代码中设置调试
- Qt 调试显示行号
- 如何将可变参数模板转换为多个单个模板?(C++竞争编程调试模板)