You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.6 KiB
61 lines
1.6 KiB
6 years ago
|
/*
|
||
|
* This document explain how to run analyse the virglrenderer
|
||
|
* code base using ASAN, the address sanitizer tools include
|
||
|
* in Clang and gcc.
|
||
|
*/
|
||
|
|
||
|
VIRGLRENDERER:
|
||
|
|
||
|
Compiling virglrenderer with the following flags:
|
||
|
`-fsanitize=address`
|
||
|
or
|
||
|
`-fsanitize=memory`
|
||
|
Sadly, we can't use both of them in the same time.
|
||
|
|
||
|
For example,
|
||
|
```
|
||
|
export CFLAGS="-fsanitize=address -fno-omit-frame-pointer"
|
||
|
export CXXFLAGS="-fsanitize=address -fno-omit-frame-pointer"
|
||
|
mkdir build && cd build
|
||
|
../autogen.sh --prefix=/home/user/virglrenderer/install --enable-debug
|
||
|
make
|
||
|
```
|
||
|
|
||
|
The `-fsanitize=leak` flag don't have to be add for Linux as
|
||
|
it is set by default. This flag can be add to the toolchain of other platform.
|
||
|
|
||
|
|
||
|
MESA:
|
||
|
|
||
|
Since mesa unloads the drivers before a program finished, but ASAN only
|
||
|
resolves stack traces at the end. It is almost impossible to get meaningful
|
||
|
backtraces and so check whether the culprit is mesa or virglrenderer.
|
||
|
Hence, it is useful to override *dlclose* by pre-loading a shared library
|
||
|
that implements a stub, e.g. like:
|
||
|
```
|
||
|
int dlclose(void *handle) {
|
||
|
return 0;
|
||
|
}
|
||
|
```
|
||
|
It seems that you need to pre-load ASAN before your dummie library.
|
||
|
`export LD_PRELOAD="/usr/lib64/gcc/x86_64-pc-linux-gnu/7.3.0/libasan.so $HOME/libfake-dlclose.so"`
|
||
|
|
||
|
|
||
|
VTEST:
|
||
|
|
||
|
Then run virglrenderer with the following flag:
|
||
|
`ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer`
|
||
|
On platform other than Linux, `ASAN_OPTIONS=detect_leaks=1`
|
||
|
should be added.
|
||
|
|
||
|
Start the vtest server with the command:
|
||
|
`ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer ./virgl_test_server`
|
||
|
|
||
|
Then connect to the server
|
||
|
```
|
||
|
export LIBGL_ALWAYS_SOFTWARE=true
|
||
|
export GALLIUM_DRIVER=virpipe
|
||
|
```
|
||
|
|
||
|
Run any payload.
|