1*bbecb9d1SAndroid Build Coastguard Worker/* 2*bbecb9d1SAndroid Build Coastguard Worker * This document explain how to run analyse the virglrenderer 3*bbecb9d1SAndroid Build Coastguard Worker * code base using ASAN, the address sanitizer tools include 4*bbecb9d1SAndroid Build Coastguard Worker * in Clang and gcc. 5*bbecb9d1SAndroid Build Coastguard Worker */ 6*bbecb9d1SAndroid Build Coastguard Worker 7*bbecb9d1SAndroid Build Coastguard WorkerVIRGLRENDERER: 8*bbecb9d1SAndroid Build Coastguard Worker 9*bbecb9d1SAndroid Build Coastguard WorkerCompiling virglrenderer with the following flags: 10*bbecb9d1SAndroid Build Coastguard Worker`-fsanitize=address` 11*bbecb9d1SAndroid Build Coastguard Workeror 12*bbecb9d1SAndroid Build Coastguard Worker`-fsanitize=memory` 13*bbecb9d1SAndroid Build Coastguard WorkerSadly, we can't use both of them in the same time. 14*bbecb9d1SAndroid Build Coastguard Worker 15*bbecb9d1SAndroid Build Coastguard WorkerFor example, 16*bbecb9d1SAndroid Build Coastguard Worker``` 17*bbecb9d1SAndroid Build Coastguard Workerexport CFLAGS="-fsanitize=address -fno-omit-frame-pointer" 18*bbecb9d1SAndroid Build Coastguard Workerexport CXXFLAGS="-fsanitize=address -fno-omit-frame-pointer" 19*bbecb9d1SAndroid Build Coastguard Workermkdir build && cd build 20*bbecb9d1SAndroid Build Coastguard Worker../autogen.sh --prefix=/home/user/virglrenderer/install --enable-debug 21*bbecb9d1SAndroid Build Coastguard Workermake 22*bbecb9d1SAndroid Build Coastguard Worker``` 23*bbecb9d1SAndroid Build Coastguard Worker 24*bbecb9d1SAndroid Build Coastguard WorkerThe `-fsanitize=leak` flag don't have to be add for Linux as 25*bbecb9d1SAndroid Build Coastguard Workerit is set by default. This flag can be add to the toolchain of other platform. 26*bbecb9d1SAndroid Build Coastguard Worker 27*bbecb9d1SAndroid Build Coastguard Worker 28*bbecb9d1SAndroid Build Coastguard WorkerMESA: 29*bbecb9d1SAndroid Build Coastguard Worker 30*bbecb9d1SAndroid Build Coastguard WorkerSince mesa unloads the drivers before a program finished, but ASAN only 31*bbecb9d1SAndroid Build Coastguard Workerresolves stack traces at the end. It is almost impossible to get meaningful 32*bbecb9d1SAndroid Build Coastguard Workerbacktraces and so check whether the culprit is mesa or virglrenderer. 33*bbecb9d1SAndroid Build Coastguard WorkerHence, it is useful to override *dlclose* by pre-loading a shared library 34*bbecb9d1SAndroid Build Coastguard Workerthat implements a stub, e.g. like: 35*bbecb9d1SAndroid Build Coastguard Worker``` 36*bbecb9d1SAndroid Build Coastguard Workerint dlclose(void *handle) { 37*bbecb9d1SAndroid Build Coastguard Worker return 0; 38*bbecb9d1SAndroid Build Coastguard Worker} 39*bbecb9d1SAndroid Build Coastguard Worker``` 40*bbecb9d1SAndroid Build Coastguard WorkerIt seems that you need to pre-load ASAN before your dummie library. 41*bbecb9d1SAndroid Build Coastguard Worker`export LD_PRELOAD="/usr/lib64/gcc/x86_64-pc-linux-gnu/7.3.0/libasan.so $HOME/libfake-dlclose.so"` 42*bbecb9d1SAndroid Build Coastguard Worker 43*bbecb9d1SAndroid Build Coastguard Worker 44*bbecb9d1SAndroid Build Coastguard WorkerVTEST: 45*bbecb9d1SAndroid Build Coastguard Worker 46*bbecb9d1SAndroid Build Coastguard WorkerThen run virglrenderer with the following flag: 47*bbecb9d1SAndroid Build Coastguard Worker`ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer` 48*bbecb9d1SAndroid Build Coastguard WorkerOn platform other than Linux, `ASAN_OPTIONS=detect_leaks=1` 49*bbecb9d1SAndroid Build Coastguard Workershould be added. 50*bbecb9d1SAndroid Build Coastguard Worker 51*bbecb9d1SAndroid Build Coastguard WorkerStart the vtest server with the command: 52*bbecb9d1SAndroid Build Coastguard Worker`ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer ./virgl_test_server` 53*bbecb9d1SAndroid Build Coastguard Worker 54*bbecb9d1SAndroid Build Coastguard WorkerThen connect to the server 55*bbecb9d1SAndroid Build Coastguard Worker``` 56*bbecb9d1SAndroid Build Coastguard Workerexport LIBGL_ALWAYS_SOFTWARE=true 57*bbecb9d1SAndroid Build Coastguard Workerexport GALLIUM_DRIVER=virpipe 58*bbecb9d1SAndroid Build Coastguard Worker``` 59*bbecb9d1SAndroid Build Coastguard Worker 60*bbecb9d1SAndroid Build Coastguard WorkerRun any payload. 61