程序调试日志

原创 2011年01月19日 18:58:00

第一个问题

今天遇到一个问题,在一个函数中出现泄漏的次数很多。这个函数是分配内存的函数(自己写的),所以要找出在什么地方调用忘记释放了的问题。

没有找到好的方法,后来想到既然调试器可以显示堆栈的调用,那么程序中也可以,搜索了一下。找到了一篇文章http://www.cnblogs.com/lbq1221119/archive/2008/04/18/1159956.html

使用内嵌汇编来显示调用的堆栈。Hook 分配内存,在hook 函数中调用显示堆栈调用。在退出的时候就将忘记释放的地方和调用的地方对应了起来。

第二个问题

我想降低内存的分配和释放次数。

于是想到了使用链表 分配,挂回。这样的简单的方法。

但是不知道对象的虚函数表怎么分配。于是我用如下代码测试了一下。

class ITest
{
public:
    virtual ~ITest(){}
    virtual void PrintName()=0;
    virtual void Print()=0;

};
class CTest
{
public:
    virtual void PrintName(){printf("CTest/n");};
    virtual void Print()
    {
        printf("a=%d b=%d/n",a,b);
    }
    CTest(){a=1;b=1;}
    int a,b;
};

CTest * pTest=(CTest*)malloc(sizeof(CTest));
    pTest->CTest::CTest();
    pTest->Print();

 

在 调用 构造函数以后虚函数表指针已经写入正确的值。

00411AB0  push        ebp 
00411AB1  mov         ebp,esp
00411AB3  sub         esp,0CCh
00411AB9  push        ebx 
00411ABA  push        esi 
00411ABB  push        edi 
00411ABC  push        ecx 
00411ABD  lea         edi,[ebp-0CCh]
00411AC3  mov         ecx,33h
00411AC8  mov         eax,0CCCCCCCCh
00411ACD  rep stos    dword ptr es:[edi]
00411ACF  pop         ecx 
00411AD0  mov         dword ptr [ebp-8],ecx
00411AD3  mov         eax,dword ptr [this]
00411AD6  mov         dword ptr [eax],offset CTest::`vftable' (4157B0h)
00411ADC  mov         eax,dword ptr [this]
00411ADF  mov         dword ptr [eax+4],1
00411AE6  mov         eax,dword ptr [this]
00411AE9  mov         dword ptr [eax+8],1
00411AF0  mov         eax,dword ptr [this]
00411AF3  pop         edi 
00411AF4  pop         esi 
00411AF5  pop         ebx 
00411AF6  mov         esp,ebp
00411AF8  pop         ebp 
00411AF9  ret             

 

在构造函数中

00411AD3  mov         eax,dword ptr [this]
00411AD6  mov         dword ptr [eax],offset CTest::`vftable' (4157B0h)
00411ADC  mov         eax,dword ptr [this]

已经将虚函数指针赋值给 this 的最开始的四个字节

于是这种使用 malloc 分配内存,手动调用构造函数。手动调用析构函数,挂回链表是可行的。

 

 

 

程序调试时的Log日志

对于一个程序员来说,只是依靠断点执行来调试程序是远远不够的。当断点到多线程的程序时估计就要泪流满面了。 因此,使用日志的方法打印出程序运行的信息是至关重要的。同时log还不会影响程序的执行,在多线程...
  • fu_zk
  • fu_zk
  • 2013年05月06日 16:12
  • 1119

让你提前认识软件开发(15):程序调试的利器—日志

第1部分 重新认识C语言 程序调试的利器—日志           如果世界上有一个人能够保证一次写出来的代码是百分之百正确的,那么毫无疑问,他一定是世界上最优秀的程序员,没有之一。为什么要求代码写好...
  • zhouzxi
  • zhouzxi
  • 2014年04月24日 08:22
  • 4360

hadoop mapreduce 程序调试日志合并查看shell

hadoop mapreduce 程序调试日志合并查看shell 上一篇文章介绍了如何在web中查看日志并且进行调试。现在介绍一种通过shell方式进行处理调试信息。 本文阅读前提: 1、已...

Android程序调试–LogCat按照日志信息级别进行输出和过滤

Android程序调试–LogCat 无论什么样的程序开发过程中,出现错误都是不可避免的,一般情况下,语法错误会被开发环境检测到,并能及时的提示我们错误的位置以及修改的方法,但是逻辑错误就不是那...

vs2010配置opencv2.4.8以及入门程序调试

1.下载和安装OpenCV SDK VS2010不用说,肯定都安装了吧。来说说当前最新的OpenCV版本2.4.8(2014年2月24日)的下载和安装。与其说是安装,不如叫解压更加合适,因为我们下载...
  • waeceo
  • waeceo
  • 2016年01月24日 16:59
  • 793

.NET应用程序调试—原理、工具、方法

阅读目录: 1.背景介绍2.基本原理(Windows调试工具箱、.NET调试扩展SOS.DLL、SOSEX.DLL) 2.1.Windows调试工具箱2.2..NET调试扩展包,SOS.D...

建立VS2008 与WindowsCE5.0 设备同步及程序调试

1、  安装Visual Studio2008 和Windows CE5.0 2、  添加.Net Compact Framework2.0 组件 Wince5.0 默认安装后没有.Net...

MATLAB程序调试方法和过程

3.8  MATLAB程序的调试和优化 在MATLAB的程序调试过程中,不仅要求程序能够满足设计者的设计需求,而且还要求程序调试能够优化程序的性能,这样使得程序调试有时比程序设计更为复杂。MAT...

Keil 程序调试窗口

一、程序调试时的常用窗口 Keil 软件在调试程序时提供了多个窗口,主要包括输出窗口(Output  Windows)、观察 窗口(Watch&Call Statck Windows)、存储器窗...
  • szw_yx
  • szw_yx
  • 2017年03月27日 20:21
  • 1413

linux程序调试补充(gdb ) (2)

http://blog.chinaunix.net/uid-21123336-id-1830540.html 后来一段时间,对linux下的程序调试有了一些新的认识,所以补充出了这一篇,前一篇文章可...
  • helonSY
  • helonSY
  • 2012年03月02日 16:51
  • 695
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序调试日志
举报原因:
原因补充:

(最多只允许输入30个字)