Лучший способ вызвать gdb из программы для печати ее stacktrace?

Используя функцию как это:

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

void print_trace() {
    char pid_buf[30];
    sprintf(pid_buf, "--pid=%d", getpid());
    char name_buf[512];
    name_buf[readlink("/proc/self/exe", name_buf, 511)]=0;
    int child_pid = fork();
    if (!child_pid) {           
        dup2(2,1); // redirect output to stderr
        fprintf(stdout,"stack trace for %s pid=%s\n",name_buf,pid_buf);
        execlp("gdb", "gdb", "--batch", "-n", "-ex", "thread", "-ex", "bt", name_buf, pid_buf, NULL);
        abort(); /* If gdb failed to start */
    } else {
        waitpid(child_pid,NULL,0);
    }
}

Я вижу детали print_trace в выводе.

Что другие пути состоят в том, чтобы сделать это?

58
задан 13 revs, 4 users 97% 27 February 2018 в 21:02
поделиться

2 ответа

Разве abort () не проще?

Таким образом, если это происходит в поле, клиент может отправить вам основной файл (я не знаю многих пользователей, которые достаточно вовлечены в мое приложение, чтобы я заставил их отладить его).

1
ответ дан 24 November 2019 в 18:54
поделиться

Если вы используете Linux, стандартная библиотека C включает функцию backtrace, которая заполняет массив адресами возврата фреймов, и другую функцию backtrace_symbols, которая берет адреса из backtrace и ищет соответствующие имена функций. Они задокументированы в руководстве GNU C Library.

Они не покажут значения аргументов, исходные строки и тому подобное, и применяются только к вызывающему потоку. Однако они должны быть намного быстрее (и, возможно, менее зыбкими), чем запуск GDB таким образом, так что они имеют свое место.

8
ответ дан 24 November 2019 в 18:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: