2017-11-22 6 views
1

私はvalgrindソースコードでいくつかの実験をしようとしています。私はテストコードとして以下のコードを使用しています:Valgrindソースコードからユーザ変数にアクセス

#include <stdio.h> 
int g_int = 12; 
int main() 
{ 
    int y = 10; 
    int x; 
    printf("%d\n",x); 
    return x; 
} 

"test.out"という名前の実行可能ファイルをビルドします。私は初期化されていないバグがあり、valgrindのは次のように私にいくつかのメッセージを与えることで、「mc_errors.c」からそのバグを報告する私のテストコードで

$./valgrind --tool=memcheck ./test.out 

:今

../build/bin$ ./valgrind --tool=memcheck --track-origins=yes --read-var-info=yes ./test >> outpur.txt 
==24255== Memcheck, a memory error detector 
==24255== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. 
==24255== Using Valgrind-3.14.0.GIT and LibVEX; rerun with -h for copyright info 
==24255== Command: ./test 
==24255== 
==24255== Conditional jump or move depends on uninitialised value(s) 
==24255== I want to print my local variable here! 
==24255== at 0x4E87B83: vfprintf (vfprintf.c:1631) 
==24255== by 0x4E8F898: printf (printf.c:33) 
==24255== by 0x400548: main (test.c:10) 
==24255== Uninitialised value was created by a stack allocation 
==24255== at 0x400526: main (test.c:6) 
==24255== 
==24255== Use of uninitialised value of size 8 
==24255== I want to print my local variable here! 
==24255== at 0x4E8476B: _itoa_word (_itoa.c:179) 
==24255== by 0x4E8812C: vfprintf (vfprintf.c:1631) 
==24255== by 0x4E8F898: printf (printf.c:33) 
==24255== by 0x400548: main (test.c:10) 
==24255== Uninitialised value was created by a stack allocation 
==24255== at 0x400526: main (test.c:6) 
==24255== 
==24255== Conditional jump or move depends on uninitialised value(s) 
==24255== I want to print my local variable here! 
==24255== at 0x4E84775: _itoa_word (_itoa.c:179) 
==24255== by 0x4E8812C: vfprintf (vfprintf.c:1631) 
==24255== by 0x4E8F898: printf (printf.c:33) 
==24255== by 0x400548: main (test.c:10) 
==24255== Uninitialised value was created by a stack allocation 
==24255== at 0x400526: main (test.c:6) 
==24255== 
==24255== Conditional jump or move depends on uninitialised value(s) 
==24255== I want to print my local variable here! 
==24255== at 0x4E881AF: vfprintf (vfprintf.c:1631) 
==24255== by 0x4E8F898: printf (printf.c:33) 
==24255== by 0x400548: main (test.c:10) 
==24255== Uninitialised value was created by a stack allocation 
==24255== at 0x400526: main (test.c:6) 
==24255== 
==24255== Conditional jump or move depends on uninitialised value(s) 
==24255== I want to print my local variable here! 
==24255== at 0x4E87C59: vfprintf (vfprintf.c:1631) 
==24255== by 0x4E8F898: printf (printf.c:33) 
==24255== by 0x400548: main (test.c:10) 
==24255== Uninitialised value was created by a stack allocation 
==24255== at 0x400526: main (test.c:6) 
==24255== 
==24255== Conditional jump or move depends on uninitialised value(s) 
==24255== I want to print my local variable here! 
==24255== at 0x4E8841A: vfprintf (vfprintf.c:1631) 
==24255== by 0x4E8F898: printf (printf.c:33) 
==24255== by 0x400548: main (test.c:10) 
==24255== Uninitialised value was created by a stack allocation 
==24255== at 0x400526: main (test.c:6) 
==24255== 
==24255== Conditional jump or move depends on uninitialised value(s) 
==24255== I want to print my local variable here! 
==24255== at 0x4E87CAB: vfprintf (vfprintf.c:1631) 
==24255== by 0x4E8F898: printf (printf.c:33) 
==24255== by 0x400548: main (test.c:10) 
==24255== Uninitialised value was created by a stack allocation 
==24255== at 0x400526: main (test.c:6) 
==24255== 
==24255== Conditional jump or move depends on uninitialised value(s) 
==24255== I want to print my local variable here! 
==24255== at 0x4E87CE2: vfprintf (vfprintf.c:1631) 
==24255== by 0x4E8F898: printf (printf.c:33) 
==24255== by 0x400548: main (test.c:10) 
==24255== Uninitialised value was created by a stack allocation 
==24255== at 0x400526: main (test.c:6) 
==24255== 
==24255== 
==24255== HEAP SUMMARY: 
==24255==  in use at exit: 0 bytes in 0 blocks 
==24255== total heap usage: 1 allocs, 1 frees, 4,096 bytes allocated 
==24255== 
==24255== All heap blocks were freed -- no leaks are possible 
==24255== 
==24255== For counts of detected and suppressed errors, rerun with: -v 
==24255== ERROR SUMMARY: 8 errors from 8 contexts (suppressed: 0 from 0) 

それから私は、コマンドの下に実行しました私は "g_int"と "y"の値をvalgrindからのメッセージ(バグレポート)と共に表示したいと思います。私はvalgrindソース印刷ですでに印刷を追加しています: "私はローカル変数をここに印刷したい!" 内部APIを使用してvalgrindソースからユーザーソースコードから変数の値を読み取る方法はありますか? ユーザーコードからすべての変数名を取得できる場合はプラスになります。

+0

はあなたをしました-g、-ggdb、または-ggdb3フラグを指定してコードをコンパイルしますか? –

+0

あなたの質問はあまり意味がありません。あなたは質問を言い換えて、おそらく完全なvalgrind出力を投稿できますか? – ks1322

+0

コンパイル時に-gを使用しました。 -ggdb3を使うべきですか? – kayas

答えて

0

これは動的メモリに関する詳細な情報を与えるオプション

--track-起源= yesの

を使用してみてください。

さらに、(-gでコンパイルについてのコメントを参照)。これは、デバッグビルドして使用する必要があります

--read-VAR-情報= yesの

を試してみてください。これにより、自動変数に関する詳細情報が得られます。

+0

あなたの提案されたオプションを使用し、編集した質問にvalgrindの出力を添付しました。しかし、valgrindソースコードからローカル変数にアクセスする方法はまだありません。 valgrind出力の変数名、値についての有用な情報は表示されません。 – kayas

+0

変数の名前は表示されませんが、エラーが発生した行が表示され、変数のスコープが示されます。私はそれが変数名を与えることを期待していた(それは、医者が言うことです)。 Valgrindの問題であり、デバッグドワーフ3の情報を読むことができます。 –

0

はvalgrindのがエラーを報告するとき、それは添付するGDB を待つことになる、valgrindのオプションこれにより--vgdb-エラー= 1

を使用してください。 gdbを使うと、すべてのローカル変数またはグローバル変数を見ることができます。

詳細はhttp://www.valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.gdbserverを参照してください。

+0

私は、コマンドラインではなく、valgrindソースから変数にアクセスします。 gdbは、コマンドラインでさまざまな情報を与えてくれます。私の質問では、私はすでにカスタムメッセージ "私のローカル変数をここに印刷したい!"を添付しています。そのメッセージの代わりに、私は自分のローカル変数を出力したい。 – kayas

+0

あなたは、valgrindによって報告されたエラーが自動的にローカル変数を表示することをお勧めしますか?おそらく、vgdb接続についてのgdbに基づいて、gdbのスクリプトを作成することができます。たとえば、 gdbでフック・ストップを使ってbactrace fullを実行してください:これはすべてのローカル変数を表示します – phd

1

これにはVALGRIND_COUNT_ERRORS,VALGRIND_PRINTF Valgrind Client Requestsを使用できます。あなたはあなたの例のコードでそれらを使用する方法をここで

#include <stdio.h> 
#include <valgrind/valgrind.h> 

int g_int = 12; 
int main() 
{ 
    int y = 10; 
    int x; 
    printf("%d\n",x); 
    if (VALGRIND_COUNT_ERRORS > 0) 
    { 
    VALGRIND_PRINTF("y=%d, g_int=%d\n", y, g_int); 
    } 
    return x; 
} 

Valgrindの出力:

==4030== Memcheck, a memory error detector 
==4030== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. 
==4030== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info 
==4030== Command: ./a.out 
==4030== 
==4030== Conditional jump or move depends on uninitialised value(s) 
==4030== at 0x4E90DDA: vfprintf (in /usr/lib64/libc-2.26.so) 
==4030== by 0x4E99285: printf (in /usr/lib64/libc-2.26.so) 
==4030== by 0x400719: main (in /home/ks/a.out) 
==4030== 
==4030== Use of uninitialised value of size 8 
==4030== at 0x4E8CDAB: _itoa_word (in /usr/lib64/libc-2.26.so) 
==4030== by 0x4E9046D: vfprintf (in /usr/lib64/libc-2.26.so) 
==4030== by 0x4E99285: printf (in /usr/lib64/libc-2.26.so) 
==4030== by 0x400719: main (in /home/ks/a.out) 
==4030== 
==4030== Conditional jump or move depends on uninitialised value(s) 
==4030== at 0x4E8CDB5: _itoa_word (in /usr/lib64/libc-2.26.so) 
==4030== by 0x4E9046D: vfprintf (in /usr/lib64/libc-2.26.so) 
==4030== by 0x4E99285: printf (in /usr/lib64/libc-2.26.so) 
==4030== by 0x400719: main (in /home/ks/a.out) 
==4030== 
==4030== Conditional jump or move depends on uninitialised value(s) 
==4030== at 0x4E90572: vfprintf (in /usr/lib64/libc-2.26.so) 
==4030== by 0x4E99285: printf (in /usr/lib64/libc-2.26.so) 
==4030== by 0x400719: main (in /home/ks/a.out) 
==4030== 
==4030== Conditional jump or move depends on uninitialised value(s) 
==4030== at 0x4E9104C: vfprintf (in /usr/lib64/libc-2.26.so) 
==4030== by 0x4E99285: printf (in /usr/lib64/libc-2.26.so) 
==4030== by 0x400719: main (in /home/ks/a.out) 
==4030== 
0 
**4030** y=10, g_int=12 
==4030== Syscall param exit_group(status) contains uninitialised byte(s) 
==4030== at 0x4F1A478: _Exit (in /usr/lib64/libc-2.26.so) 
==4030== by 0x4E77B3A: __run_exit_handlers (in /usr/lib64/libc-2.26.so) 
==4030== by 0x4E77BD9: exit (in /usr/lib64/libc-2.26.so) 
==4030== by 0x4E5D040: (below main) (in /usr/lib64/libc-2.26.so) 
==4030== 
==4030== 
==4030== HEAP SUMMARY: 
==4030==  in use at exit: 0 bytes in 0 blocks 
==4030== total heap usage: 1 allocs, 1 frees, 1,024 bytes allocated 
==4030== 
==4030== All heap blocks were freed -- no leaks are possible 
==4030== 
==4030== For counts of detected and suppressed errors, rerun with: -v 
==4030== Use --track-origins=yes to see where uninitialised values come from 
==4030== ERROR SUMMARY: 6 errors from 6 contexts (suppressed: 0 from 0) 

変数g_intyは、この行に印字されています

**4030** y=10, g_int=12 
+0

お返事ありがとうございます。実際には、Valgrindのソースコード内でローカル変数(特にスレッドローカル変数)の値を使用したいと思います。値を表示するだけではうまくいきません。私はValgrindのソースコードの中でスレッドローカル変数の値を取得する必要があります。あなたはそれについて私にいくつかの示唆を与えることができますか? – kayas

関連する問題