Увеличить трассировку стека, не показывая имена функций и номера строк - PullRequest
0 голосов
/ 01 октября 2018

Я изучал boost::stacktrace, пытаясь на простом примере напечатать стек вызовов рекурсивной функции.

#include "boost/stacktrace.hpp"

int factorial(int x){
    if (x < 2) {
        std::cout << boost::stacktrace::stacktrace();
        return 1;
    }
    return x * factorial(x - 1);
}

int main(int ac, char *av[]) {
    std::cout << factorial(4);
}

Однако выходные данные кода не содержат никакой информации о названии функции и номере строки:

 0# 0x000055A6F6B57C0F in /home/user/myapp
 1# 0x000055A6F6B57C42 in /home/user/myapp
 2# 0x000055A6F6B57C42 in /home/user/myapp
 3# 0x000055A6F6B57C42 in /home/user/myapp
 4# 0x000055A6F6B57C9D in /home/user/myapp
 5# __libc_start_main in /lib/x86_64-linux-gnu/libc.so.6
 6# 0x000055A6F6B57AEA in /home/user/myapp

Это отличается от примера вывода с веб-сайта повышения:(скопировано с https://www.boost.org/doc/libs/1_68_0/doc/html/stacktrace/getting_started.html#stacktrace.getting_started.how_to_print_current_call_stack)

0# bar(int) at /path/to/source/file.cpp:70
1# bar(int) at /path/to/source/file.cpp:70
2# bar(int) at /path/to/source/file.cpp:70
3# bar(int) at /path/to/source/file.cpp:70
4# main at /path/to/main.cpp:93
5# __libc_start_main in /lib/x86_64-linux-gnu/libc.so.6
6# _start

Почему я не вижу номера исходных строк и имена функций в выводе трассировки стека?

Я включил отладочную информацию в своем проекте -уровень CMakeList.txt:

set(CMAKE_BUILD_TYPE Debug)

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

nm -an myapp | c++filt | grep factorial

0000000000000f40 t _GLOBAL__sub_I__Z9factoriali
00000000000010f0 T factorial(int)

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

У меня недостаточно репутации, чтобы комментировать, поэтому я расширю ответ Джорди здесь:

  1. Убедитесь, что отладочная информация включена: например, -g

  2. Ссылка на libdl: -ldl

  3. Определить один из необходимых макросов (для получения номеров строк): например, -DBOOST_STACKTRACE_USE_ADDR2LINE

  4. Компиляция и связь с опциями -no-pie и -fno-pie.

0 голосов
/ 22 марта 2019

Вам нужно сделать несколько вещей (это для Linux):

  1. Убедитесь, что отладочная информация включена: например, -g

  2. Ссылка на libdl: -ldl

  3. Определите один из необходимых макросов (для получения номеров строк): например, -DBOOST_STACKTRACE_USE_ADDR2LINE

Вся эта информация предоставляется здесь:

https://www.boost.org/doc/libs/1_69_0/doc/html/stacktrace/configuration_and_build.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...