16

で検出されたメモリ エラーをデバッグしようとしていますが、 では検出さclangasanませんでしたvalgrind。しかし、clangビルドされたバイナリを取得して、有用なデバッグ情報を得ることができません。短いテスト プログラムでこれを実証できます。

#include <stdlib.h>
#include <string.h>

int main(void)
{
    char *a = malloc(8);
    memset(a, 0, 9);
    free(a);
    return 0;
}

(明らかに、このエラーによって検出されます。valgrind純粋に の問題を示すためclangです。)

次のように Clang 3.4-1ubuntu1 でコンパイルします。

clang -fsanitize=address -fno-sanitize-recover -o test -O0 -g test.c

案の定、./test中止し、いくつかのデバッグ情報が表示されます。

==3309==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200000eff8 at pc 0x43e950 bp 0x7fff168724f0 sp 0x7fff168724e8
WRITE of size 9 at 0x60200000eff8 thread T0
    #0 0x43e94f (/home/jason/Code/astest/test+0x43e94f)
    #1 0x7faa43c47de4 (/lib/x86_64-linux-gnu/libc.so.6+0x21de4)
    #2 0x43e6ac (/home/jason/Code/astest/test+0x43e6ac)
0x60200000eff8 is located 0 bytes to the right of 8-byte region [0x60200000eff0,0x60200000eff8)
allocated by thread T0 here:
    #0 0x42cc25 (/home/jason/Code/astest/test+0x42cc25)
    #1 0x43e874 (/home/jason/Code/astest/test+0x43e874)
    #2 0x7faa43c47de4 (/lib/x86_64-linux-gnu/libc.so.6+0x21de4)

しかし、私が本当に知りたいのは、エラーが発生した行番号と、メモリが割り当てられた場所です。

clang+からこの情報を取得するにはどうすればよいasanですか?

4

5 に答える 5

20

clang AddressSanitizer のドキュメントを見ると、次のように書かれています。

AddressSanitizer がその出力をシンボル化するには、 ASAN_SYMBOLIZER_PATH 環境変数を llvm-symbolizer バイナリを指すように設定する必要があります (または llvm-symbolizer が $PATH にあることを確認してください)。

次の例を示します。

ASAN_SYMBOLIZER_PATH=/usr/local/bin/llvm-symbolizer ./a.out

OPが指摘したように、インストール場所は異なる場合がありますが、場所がわかればllvm-symbolizer手順は同じです.

于 2014-07-04T10:44:23.213 に答える
14

addr2lineはあなたが探しているものですか?

 $ addr2line -e ./test 0x43e94f
 some/file.c:1234
于 2014-07-04T03:51:54.843 に答える