ADDR2LINE сообщает номер строки, которая 1 номер? - PullRequest
4 голосов
/ 18 июня 2011

Я использую ADDR2LINE в Linux, и у меня есть следующий код, который специально сгенерировал ошибку сегментации для тестирования

79 free(var1);
80
81 printf("Thread end...\n");
82 free(var1);
83 }

Строка 82 выше - это та, которая делает "двойную свободную", и та, которая вызываетдамп ..... однако, когда я использую ADDR2LINE в командной строке, он сообщает номер строки, вызвавшей ошибку, как 83, а не 82?

Я что-то здесь упускаю?Упоминает ли ADDR2Line СЛЕДУЮЩУЮ линию?

Спасибо за helo

Lynton

1 Ответ

1 голос
/ 20 июня 2011

ADDR2LINE дает номер строки, в которой произошел сбой, а не следующий.Попробуйте добавить этот код рядом с main (), чтобы получить обратную трассировку последних адресов и передать их на addr2line .. посмотрите, что вы получите.

void sig_segv(int signo)
{
// Generate backtrace
void *addresses[40];
char **strings;
int c = backtrace(addresses, 40);
strings = backtrace_symbols(addresses,c);
printf("backtrace returned: %d\n", c); 
for (int i = 0; i < c; i++) {
    std::cout << strings[i] << std::endl;
}   
exit(1);
}

внутри main ()

signal(SIGSEGV, sig_segv);

Единственная правильная причина / объяснение этого - да, это происходит сбой при свободной функции.Но при возвращаемом значении и, следовательно, это означает конец строки 82 и начало строки 83.

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