Как заставить ASan показывать более одной строки callstack?

c++ gcc stack-trace callstack address-sanitizer

172 просмотра

1 ответ

615 Репутация автора

В настоящее время, когда я запускаю свое приложение, я получаю следующий вывод:

/usr/include/c++/4.8/debug/vector:346:error: attempt to subscript container
    with out-of-bounds index 1, but container only holds 1 elements.

Objects involved in the operation:
sequence "this" @ 0x0x60400000fd30 {
  type = NSt7__debug6vectorIdSaIdEEE;
}
Aborted (core dumped)

Он скомпилирован с официальным Ubuntu 14.04 GCC и флаги компиляции:

-fPIC -std=c++11 -fopenmp -Wall -pedantic -Wunused -O0 -g3 -fsanitize=address -fno-omit-frame-pointer -D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC -fprofile-arcs -ftest-coverage --coverage

LLVM и clang также устанавливаются из коробки, и приложение запускается так:

ASAN_OPTIONS=symbolize=1 ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.4 ./app

Почему появляется только одна строка стека вызовов? Как получить контекст, который будет связан с моим приложением?


Примечание: если я запускаю из-под GDB

gdb ./app
run
where

Я получаю читаемый стек вызовов (с номерами линий и деталями вызова). (GDB) где

#0  0x00007ffff3640c37 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1  0x00007ffff3644028 in __GI_abort () at abort.c:89
#2  0x00007ffff43c7fe5 in __gnu_debug::_Error_formatter::_M_error() const ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x0000000000427184 in std::__debug::vector<double, std::allocator<double> >::operator[] (this=0x60400000fd30,
    __n=1) at /usr/include/c++/4.8/debug/vector:346
#4  0x00007ffff47f6bfa in GeneralParameters::GeneralParameters...

все же я хочу получить вывод стека вызовов без запуска gdb для каждого из моих 100+ приложений модульного тестирования - я хочу видеть такие ошибки непосредственно, при ctest -VVкоторых все мои тесты выполняются по порядку.

Автор: DuckQueen Источник Размещён: 18.07.2016 01:07

Ответы (1)


0 плюса

8574 Репутация автора

Кажется, что эта ошибка происходит не от ASan, а от реализации вектора отладки STL. Он не даст вам много информации о трассировке стека, но просто прервет выполнение (как, например, _FORTIFY_SOURCE).

Автор: yugr Размещён: 12.11.2016 05:31
Вопросы из категории :
32x32