Re: 内存块的gap被改写,求思路。
C/C++本地代码调试
内存块的gap被改写,求思路。
chena_cpp
2013-10-10, 21:30 下午
struct A
{
......
wstring a;
wstring b;
......
};
vector<A *> a;
程序启动的时候,初始化a,vector的size是240。
经过一定步骤之后,退出程序,删除a,在delete其中一个A *(v0)的时候,crt报错。
我查看内存,发现v0->b的内存块后面是FD FD FD 00,我分析是有野指针写入最后一个字节。
如果v0是固定的索引,比如每次都是第40个,那么可以在初始化的时候给v0->b内存块的gap最后一个字节设一个内存断点。
但每次这个索引都是随机的,不过每次都是这个vector里的string出错。
有办法找到什么时候写入的吗?
Re: 内存块的gap被改写,求思路。
Blade
2013-10-13, 08:38 上午
你是不是有跨模块释放内存, 也就是在A模块中申请的内存到B模块中释放, 这样会出问题的, 因为不同模块的Heap是相互独立的 (/M 方式编译), 跨模块释放是不允许的。 因为我碰到过几次string 出问题, 都是因为这个原因引起的, 所以想你会不会也是因为这个原因。
如果要打硬件断点的话需要指定地址吧? 要不你把vector的 size设置小一点, 然后在每个索引下的 gap位置都打上断点?
Re: 内存块的gap被改写,求思路。
格蠹老雷
2013-10-15, 06:59 上午
也可以尝试页堆
Re: 内存块的gap被改写,求思路。
哈姆雷特
2013-10-27, 13:42 下午
有两条思路:
1. 张老师说的应该是应用程序验证器(Windows Application Verifier),启用full page heap。这个工具可以在内存写越界时中断到调试器。http://www.microsoft.com/downloads/details.aspx?FamilyID=c4a25ab9-649d-4a1b-b4a7-c9d8b095df18&DisplayLang=en&displaylang=en
2. 按照楼上说的,可能有跨模块的分配释放。为了确认的话,可以跟踪对象的分配和释放的时候是否用了同一个heap handle.