Quando si compila con -fsanitize=memory
ottengo WARNING: Trying to symbolize code, but external symbolizer is not initialized!
durante l'esecuzione del programma. Come inizializzare il simbolizzatore esterno?Come inizializzare il simbolizzatore esterno di LLVM?
risposta
ho risolto il mio problema utilizzando MSAN_SYMBOLIZER_PATH=$(which llvm-symbolizer-3.4) ./a.out
. Il problema è che Ubuntu postfix il numero di versione ma il binario non lo sa. Naturalmente è necessario utilizzare MSAN
invece di ASAN
quando si utilizza il disinfettante memoria.
Si suppone di essere in grado di impostare la variabile d'ambiente ASAN_FILTER per puntare a uno symbolizer, ma non riuscivo a farlo funzionare. Tuttavia, è possibile reindirizzare lo stderr in un simbolizzatore dopo il fatto. Riceverai comunque gli avvertimenti sul simbolizzatore non inizializzato, ma i nomi dei file e delle linee saranno corretti.
È possibile utilizzare asan_symbolizer.py come symbolizer esterna. Dopo aver scaricato da questo link (a/tmp, per esempio), richiamare il programma in questo modo (in bash, per questo esempio):
./myprogram 2>&1 | /tmp/asan_symbolize.py | c++filt
Ho ricevuto questo avviso quando eseguo la versione di debug del programma (compilata con -fsanitize=address
) su un computer Linux che non conteneva l'installazione clang
. Il problema è scomparso dopo aver installato clang
da .
Sul mio sistema Ubuntu, il problema è che gli strumenti di LLVM sono installati sotto /usr/bin
con suffissi di versione (come llvm-symbolizer-4.0
), e gli strumenti di disinfestazione li stanno cercando senza suffissi di versione.
LLVM installa anche i suoi binari, ad esempio, /usr/lib/llvm-4.0/bin
; gli strumenti sotto /usr/bin
sono in realtà solo collegamenti simbolici. Quindi una soluzione facile è quello di aggiungere la directory appropriata /usr/lib/llvm-*/bin
al percorso quando si lavora con disinfettanti.