Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

WinDbg

帖子发起人: Ethan   发起时间: 2009-11-25 09:56 上午   回复: 3

Print Search
帖子排序:    
   2009-11-25, 09:56 上午
Ethan.Zhao 离线,最后访问时间: 2009/11/25 9:51:38 Ethan

发帖数前500位
注册: 2009-11-25
发 贴: 2
请问有什么好方法调试"Free Heap block AXXXXXXXX modified at BXXXXXXXX after it was freed"
Reply Quote
请问有什么好方法调试"Free Heap block AXXXXXXXX modified at BXXXXXXXX after it was freed".

谢谢


IP 地址: 已记录   报告
   2009-11-26, 12:41 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请问有什么好方法调试"Free Heap block AXXXXXXXX modified at BXXXXXXXX after it was freed"
Reply Quote
如果问题可以在附加调试器时重现,那么对BXXXXXXXX设置个数据断点,访问时中断下来,就知道是哪段代码在访问已经释放了内存...
IP 地址: 已记录   报告
   2009-11-27, 15:27 下午
Ethan.Zhao 离线,最后访问时间: 2009/11/25 9:51:38 Ethan

发帖数前500位
注册: 2009-11-25
发 贴: 2
Re: 请问有什么好方法调试"Free Heap block AXXXXXXXX modified at BXXXXXXXX after it was freed"
Reply Quote
谢谢张老师:)
我的程序每次出现问题的时候BXXXXXX的值都不确定, 如何能够跟踪定位呢. 而且有些库的pdb文件没有啊

IP 地址: 已记录   报告
   2013-02-17, 22:43 下午
s499068735 离线,最后访问时间: 2013/2/17 14:37:24 s499068735

无等级
注册: 2013-02-17
发 贴: 1
Re: 请问有什么好方法调试"Free Heap block AXXXXXXXX modified at BXXXXXXXX after it was freed"
Reply Quote

可以参考这篇文章:http://www.zengl.com/html/genlanmu/zenglbianchengyuyan/article-46.html

里面有一段详细说明了这个错误可能出现的原因,和可以用于调试的方法:

.................. //省略前面的内容  
  另外以前的版本生成的Release版本的zengl_lang_v0.0.XX.exe在编译zengl脚本时都会报"Free Heap block AXXXXXXXX modified at BXXXXXXXX after it was freed"的错误,这是堆溢出错误,意思是程序修改的堆空间在之前已经被释放掉了(释放掉的内存空间是不可以进行写入操作的), 但是这个错误在写入的时候并不会弹出来,因为如果在每次写堆空间时都进行堆检查那么程序的系统的开销就会变的很大,一般只有在free,或者malloc 操作甚至是fclose操作时,当要释放堆空间或重利用堆空间时,系统才会进行堆的检查,所以这个错误就只有在free或malloc或realloc之 类的函数中才会弹出,但是显然写入操作并不是在这些函数中进行的,所以导致这个BUG找了很久,最后通过在BXXXXXX内存位置设置数据断点来查看当这 个内存改变时中断程序才找到执行写入的代码位置(一开始找错了方向,在AXXXXX上下断点,所以找了半天,这个AXXXXX内存只是heap block堆块的起始地址,一般一个heap block有4096个字节也就是内存中的一页大小)。
 
 
/*将child对应的节点加入到parent节点的子节点中。*/
void AddNodeChild(int parent,int child)
{
    NodeChild_Type *childs  = &AST_nodes.nodes[parent].childs;
    Node_Type * nodes = AST_nodes.nodes;
    if(childs->count < NODECHILD_SIZE)
    {
        if(childs->childnum[childs->count] == -1)
            childs->childnum[childs->count++] = child;
        if(child >= 0 && child <= AST_nodes.count-1) //如果没有这条判断,那么当child为-1时就越界了,这个BUG很难查的!!因为他不会在越界的时候告诉你,而是在其他的稀奇古怪的地方提示,要设置内存数据断点,反复调试才能找出来。
            nodes[child].parentnode = parent; //设置child节点的parentnode字段为parent.
        return;
    }
.............................//省略N行代码

    上面当AddNodeChild函数的child参数为-1时如果没有if(child >= 0 && child <= AST_nodes.count-1)做判断,那么nodes[child].parentnode = parent;就会写入到nodes数组的-1索引的位置,nodes是在堆中动态分配的内存块,也就是会写入到内存块之前的位置,这样就发生了向后溢出,在写入时并不会中断,所以比较难找。
    当然对于这样的BUG可以使用gflags.exe工具进行调试,这个工具是Debug tools for windows工具集中的一部分,我将它也放在百度盘中,下载地址为:
http://pan.baidu.com/share/link?shareid=224174&uk=940392313 ,下载后安装该程序,该程序会再从网上下载完整版的安装程序然后自动安装,在完整版的安装目录中就有gflags.exe工具,下面介绍下该工具如何查找堆溢出BUG:

    在cmd下cd进入安装目录,然后输入 gflags.exe /p /enable xxxx.exe /full 这样就可以对xxxx.exe进行向前堆栈溢出的检查,如定义了一个数组int test[10]={0};如果test[12]=0; 这时visual studio就会立刻在这个位置中断并提示内存写入异常,因为test数组只有10个元素,但test[12]却访问到第13个元素,所以属于内存溢出, 如果要检查向后溢出,就需要使用gflags.exe /p /enable xxxx.exe /full /backwards命 令,多了个/backwards参数,如刚才的int test[10]={0};如果此时有段代码是test[-1]=0;那么visual studio就会在此中断。注意:向前溢出检查不可以同时检查向后溢出,所以你需要执行两次,一个向前溢出检查,一个向后溢出检查,才能判断你的程序是否 完全没有溢出,在使用gflags工具时,笔者就犯了这个错误没使用/backwards参数,所以就没检查出向后溢出的BUG。

  如果没有gflags进行设置,那么就无法在写入溢出时中断,就只有在其他的malloc,free,realloc之类的函数中才会检测到。


IP 地址: 已记录   报告
高端调试 » 软件调试 » WinDbg » Re: 请问有什么好方法调试"Free Heap block AXXXXXXXX modified at BXXXXXXXX after it was freed"

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.