5時間以上実行した後にSIGABRTするプログラムがあります。valgrind でチェックした後のメモリ リークが原因である可能性が最も高いですが、valgrind レポート (単にアドレスと ??? を含む) に基づいて、どの変数が実際にこの問題を引き起こしているかを追跡しています。
valgrind と gdb を使用してステップスルーしようとしています。ただし、(428 ラウンドのループ後) リークに到達するまでに 5 時間かかるため、たとえば 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