我有一个程序在执行 > 5 小时后发出 SIGABRT。这很可能是由 valgrind 检查后的内存泄漏引起的,但我有问题根据 valgrind 报告(它只包含地址和???)来追踪到底是哪个变量导致了这个问题。
我尝试使用 valgrind 和 gdb 来逐步完成。但是,由于需要 5 小时才能到达泄漏点(循环 428 轮之后),我想设置一个断点,比如说,当 loop=428 时,然后进入代码。我怎样才能做到这一点?
根据下面的一个简单程序,我可以知道,
a)如何跟踪变量'a'中的值变化?
b) 当loop = 428时如何设置断点?
typedef struct data_attr {
int a[2500];
}stdata;
typedef struct pcfg{
stdata *data;
}stConfig;
int funcA(stConfig* pt){
int loop = 0;
while (loop < NUM_NODE){
pt->data->a[0] = 1000;
pt->data->a[0] = 1001;
loop++;
}
return 0;
}
int main(){
stConfig *p;
p = (stConfig*) malloc(sizeof(stConfig));
p->data = (stdata*) malloc (sizeof(stdata));
funcA(p);
free(p->data);
free (p);
return 0;
}
我在 ubuntu 10.04 上使用 valgrind 3.7
@valgrind 终端,
valgrind -v --vgdb=yes --vgdb-error=0 --tool=memcheck --leak-check=full --leak-resolution=high --num-callers=40 --track-origins=yes --日志文件=mr3m1n2500_valgrind_0717_1155.txt ./pt m >& mr3m1n2500_logcheck_0717_1155.txt
@gdb 终端我试图获取 'p' 的地址,但它返回 void,为什么?
> gdb ./pt
(gdb) target remote | vgdb
Remote debugging using | vgdb
relaying data between gdb and process 12857
Reading symbols from /lib/ld-linux.so.2...Reading symbols from /usr/lib/debug/lib/ld-2.11.1.so...done.
done.
Loaded symbols for /lib/ld-linux.so.2
[Switching to Thread 12857]
0x04000850 in _start () from /lib/ld-linux.so.2
(gdb) p $p
$1 = void
(gdb) bt 10
#0 0x04000850 in _start () from /lib/ld-linux.so.2