Как Backtrace работает в Linux x86_64? - PullRequest
0 голосов
/ 04 января 2012

У меня есть несколько вопросов:

  1. int backtrace (void ** buffer, int size);Здесь буфер является массивом указателей.и элементы массива возвращают точки на каждый кадр стека в ответ.Итак, backtrace () внутренне вызывает malloc () количество раз как количество кадров?почему это для?
  2. выше выделенная память не освобождается () от backtrace (), поэтому, кто освобождает эту память?backtrace ()?
  3. где найти исходный код backtrace ()?
  4. как мне написать код для трассировки в сборке?

Ответы [ 2 ]

4 голосов
/ 04 января 2012

Пожалуйста, прочтите страницу руководства для более точного отслеживания. Вы, кажется, ошибаетесь в отношении некоторых основ:

  1. Нет, array - это ваш буфер указателей, которые заполняются backtrace(), чтобы указывать на кадры стека. Звонки на malloc() не производятся.
  2. Вы, так как это ваша память.
  3. Не применимо, backtrace() не звонит malloc().
  4. Это часть GNU libc. Здесь является одной частью реализации.
  5. Возможно, скопировав указатель стека и вручную пройдя по стеку.

Вы, кажется, путаете backtrace() с backtrace_symbols(), последнее включает в себя выделение памяти.

Чтобы прочитать текущую обратную трассировку максимум до 64 уровней, просто выполните:

void *stack[64];
const int depth = backtrace(stack, sizeof stack / sizeof *stack);
0 голосов
/ 06 марта 2019

Очевидно, что функция GNU backtrace() вызывает malloc() один раз, а затем никогда больше не вызывает.Если кто-то проверяет источник, он видит, что backtrace () вызывает несколько функций «dl», чтобы разматывать стек, и одна из них должна вызывать malloc ().Я согласен, что malloc() вызывается.Я решаю проблему, когда загружаю свои heapmanager перехватчики, вызывая backtrace() один раз во время фазы инициализации, чтобы избежать рекурсивного вызова перехваченной функции malloc(), поскольку я пытаюсь составить список последовательностей вызова в моем программном обеспечениисвязано с кучей.

...