2013-12-13 60 views
2

我在运行C++应用程序时遇到seg故障。在gdb中,它显示了我的一个指针位置被破坏了。但是我在应用程序中创建了成千上万个这样的对象指针。我如何看一个导致崩溃的问题 我可以在bt命令中执行任何操作来查看该指针的生命周期吗?在C++代码中追踪指针gdb

感谢 鲁奇

+1

看看Valgrind的,它应该给你你需要 – Jupotter

回答

1

据我知道你不能使用gdb的帮助下得到这样的信息,但对于这些目的,你可以尝试的valgrind MEMCHECK与选项--track-起源

+0

由于SIM卡的信息,你可以请让我知道了跟踪起源语法..我想不出获得valgrind的帮助? – Ruchi

+0

[4。 Memcheck:内存错误检测器](http://valgrind.org/docs/manual/mc-manual.html)[4.3。 Memcheck命令行选项](http://valgrind.org/docs/manual/mc-manual.html#mc-manual.options) – sim

1

我在过去的一些mem-leaks问题(由编译器错误引起)在约256K指针的应用程序中,所以我不得不以某种方式检查它。经过一番努力,我创建了一个所有分配的指针和它们的大小以及一些函数来保持它的更新。结果是这样的:

文件:mmap.h

//--------------------------------------------------------------------------- 
//--- Memory map system ver: 2.03 ------------------------------------------- 
//--------------------------------------------------------------------------- 
#ifndef _mmap_h 
#define _mmap_h 
//--------------------------------------------------------------------------- 
#define _mmap_aprox 
//--------------------------------------------------------------------------- 
/* 
    new 
    #ifdef _mmap_h 
    if() mmap_new('Main',,sizeof()); 
    #endif 

    #ifdef _mmap_h 
    if() mmap_del('Main',); 
    #endif 
    delete 
*/ 
//--------------------------------------------------------------------------- 
struct _mmap_entry 
    { 
    char ids[4];       // id string 
    DWORD beg,end;       // mem adr <beg,end) 
    _mmap_entry(){ beg=0; end=0; ((DWORD*)(ids))[0]='LLUN'; }; 
    _mmap_entry(_mmap_entry& a) { *this=a; } 
    ~_mmap_entry() {} 
    _mmap_entry* operator = (const _mmap_entry *a) { *this=*a; return this; } 
    //_mmap_entry* operator = (const _mmap_entry &a) { ...copy... return this; } 
    }; 
//--------------------------------------------------------------------------- 
const int _mmap_entries=4*1024;    // max num of allocated memory chunks (pointers) 
const int _mmapn_entries=32;    // num of last news to remember 
const int _mmapd_entries=32;    // num of last dels to remember 
static _mmap_entry mmap [_mmap_entries]; // memory map table active ptrs 
static _mmap_entry mmapn[_mmapn_entries]; // memory map table last news 
static _mmap_entry mmapd[_mmapd_entries]; // memory map table last dels 
static int mmaps=0;       // num of used entries in memory map table 
static int mmapn_ix=0;      // num of last deletes to remember 
static int mmapd_ix=0;      // num of last deletes to remember 
static int mmap_errs=0;      // error count 
static int mmap_news=0;      // allocations count 
static int mmap_dels=0;      // deallocations count 
//--------------------------------------------------------------------------- 
void mmap_err(const char* msg,DWORD ptr) // breakpointeable error 
    { 
    mmap_errs++; 
    } 
//--------------------------------------------------------------------------- 
int mmap_new(DWORD ids,void* ptr,DWORD siz) // tracks all allocations return false if error 
    { 
    mmap_news++; 
    int i,j; _mmap_entry e,*p; 
    e.beg=DWORD(ptr); 
    e.end=e.beg+siz; 
    e.ids[0]=((char*)&ids)[3]; 
    e.ids[1]=((char*)&ids)[2]; 
    e.ids[2]=((char*)&ids)[1]; 
    e.ids[3]=((char*)&ids)[0]; 
    if (e.beg==0) 
     { 
     mmap_err("Not enough memory.",e.beg); 
     return 0; 
     } 
    // find first i where mmap[i].end >= e.beg 
    #ifdef _mmap_aprox 
    if (!mmaps) i=0; 
    else{ 
     for (j=1;j<mmaps;j<<=1); j>>=1; if (!j) j=1; 
     for (i=0;j;j>>=1) 
      { 
      i|=j; 
      p=mmap+i; 
      if ((i>=mmaps)||(e.beg<p->end)) i^=j; 
      if ((e.beg<p->end)&&(e.end>p->beg)) 
       { 
       mmap_err("Bad allocation.",e.beg);  // memory already allocated 
       return 0; 
       } 
      } 
     if (e.beg>=mmap[i].end) i++; 
     } 
    #endif 
    #ifndef _mmap_aprox 
    for (i=mmaps-1,p=mmap+i;i>=0;i--,p--) 
    if (e.beg<p->end) 
     { 
     if (e.end>p->beg) 
      { 
      mmap_err("Bad allocation.",e.beg);  // memory already allocated 
      return 0; 
      } 
     } else break; i++; 
    #endif 
    // insert new pointer at i 
    if (mmaps>=_mmap_entries) 
     { 
     mmap_err("Too many pointers.",e.beg); // _mmap_entries is too low 
     return 0; 
     } 
    for (j=mmaps;j>i;j--) mmap[j]=mmap[j-1]; 
    mmap[i]=e; mmaps++; 
    // remember last new in mmapn table 
    mmapn[mmapn_ix]=e; mmapn_ix++; 
    if (mmapn_ix>=_mmapn_entries) mmapn_ix=0; 
    return 1; 
    }; 
//--------------------------------------------------------------------------- 
int mmap_del(DWORD ids,void* ptr)    // tracks all deallocations return false if error 
    { 
    mmap_dels++; 
    int i,j; _mmap_entry *p; 
    DWORD adr=DWORD(ptr); 
    if (adr==0) 
     { 
     mmap_err("Can not delete NULL.",adr); 
     return 0; 
     } 
    if (mmap<=0) 
     { 
     mmap_err("Nothing to delete.",adr); 
     return 0; 
     } 
    // find mmap[i] where beg==ptr and delete it if found 
    #ifdef _mmap_aprox 
    if (!mmaps) i=0; 
    else{ 
     for (j=1;j<mmaps;j<<=1); j>>=1; if (!j) j=1; 
     for (i=0;j;j>>=1) 
      { 
      i|=j; 
      p=mmap+i; 
      if ((i>=mmaps)||(adr<p->beg)) i^=j; 
      } 
     if (adr==mmap[i].beg) 
      { 
      if (mmaps>1) for (j=i;j<mmaps-1;j++) mmap[j]=mmap[j+1]; 
      mmaps--; 
      // remember last delete in mmapd table 
      mmapd[mmapd_ix]=mmap[mmaps]; mmapd_ix++; 
      if (mmapd_ix>=_mmapd_entries) mmapd_ix=0; 
      // delete ptr from mmap table 
      mmap[mmaps].beg=0; 
      mmap[mmaps].end=0; 
      return 1; 
      } 
     for (p=mmap,j=0;j<=i;j++,p++)    // test all mmap[j].beg < adr 
     if (adr<p->end)       // if overlap then ... 
      { 
      mmap_err("Wrong delete pointer.",adr); // pointer inside already allocated space 
      return 0; 
      } 
     } 
    #endif 
    #ifndef _mmap_aprox 
    for (p=mmap,i=0;i<mmaps;i++,p++) 
    if (p->beg==adr) 
     { 
     if (mmaps>1) for (j=i;j<mmaps-1;j++) mmap[j]=mmap[j+1]; 
     mmaps--; 
     mmap[mmaps].beg=0; 
     mmap[mmaps].end=0; 
     return 1; 
     } else if (p->beg>adr) break; 
    for (p=mmap,i=0;i<mmaps;i++,p++) 
    if ((adr>p->beg)&&(adr<p->end)) 
     { 
     mmap_err("Wrong delete pointer.",adr); // pointer inside already allocated space 
     return 0; 
     } 
    #endif 
    mmap_err("Delete pointer not found.",adr); 
    return 0; 
    }; 
//--------------------------------------------------------------------------- 
#endif 
//--------------------------------------------------------------------------- 
//--------------------------------------------------------------------------- 

现在在你的代码只是这样做:

// edit the safe big enough number of pointers to use for your application in begin of the mmap.h 
_mmap_entries=512*1024; 

// before any delete/delete[] of pointer ptr add this: 
#ifdef _mmap_h 
if (ptr!=NULL) mmap_del('info',ptr); 
#endif 
if (ptr!=NULL) delete[] ptr; 

// after any new of pointer ptr of size siz [byte] add this: 
ptr=new BYTE[siz]; 
#ifdef _mmap_h 
if (ptr!=NULL) mmap_new('info',ptr,siz); 
#endif 

所以,如果你有mmap.h 作为第一包括: !内部函数void mmap_err

  • 地方断点(为const char *味精,DWORD PTR)
  • 运行应用
  • 如果那么它将异常之前打破,所以你可以真正看到的信息和种类发生任何配置错误关闭错误,也是在错误发生

可以一步代码我BDS2006的Turbo C++的用户,所以如果我忘了一些VCL东西只是将它转换为MSVC++或评论我,我会做,但我没有看到任何可能导致麻烦的事情。

PS。我发现我的编译器是一个致命的错误:

  1. 删除指针不止一次
  2. 有结构没有适当的构造函数/析构函数

在这两种情况下不会引发任何异常,但内存管理器之后被破坏,所以它分配错误,因此例外

适当的构造函数/析构函数为我的编译器
所有结构和类将被动态分配或它们的组成
的纽约是这样的:

class/struct T 
    { 
public: 
    T()  {} 
    T(T& a) { *this=a; } 
    ~T() {} 
    T* operator = (const T *a) { *this=*a; return this; } 

    // if any dynamic allocation occur then this must be done also else not 
    //T* operator = (const T &a) { ... copy a to this ... return this; } 
    };