стек вызовов печати в C или C ++ - PullRequest
93 голосов
/ 10 октября 2010

Есть ли способ сбросить стек вызовов в запущенном процессе на C или C ++ каждый раз, когда вызывается определенная функция? Я имею в виду что-то вроде этого:

void foo()
{
   print_stack_trace();

   // foo's body

   return
}

Где print_stack_trace работает аналогично caller в Perl.

Или как то так:

int main (void)
{
    // will print out debug info every time foo() is called
    register_stack_trace_function(foo); 

    // etc...
}

, где register_stack_trace_function устанавливает некую внутреннюю точку останова, которая будет вызывать вывод трассировки стека при каждом вызове foo.

Существует ли что-либо подобное в какой-либо стандартной библиотеке C?

Я работаю в Linux, использую GCC.


* * Фон тысяча двадцать-один * * тысяча двадцать-дв

У меня есть тестовый прогон, который ведет себя по-разному в зависимости от некоторых параметров командной строки, которые не должны влиять на это поведение. В моем коде есть генератор псевдослучайных чисел, который, как я полагаю, вызывается по-разному в зависимости от этих переключателей. Я хочу иметь возможность запустить тест с каждым набором переключателей и посмотреть, вызывается ли генератор случайных чисел по-разному для каждого из них.

Ответы [ 12 ]

0 голосов
/ 10 октября 2010

Вы можете использовать профилировщик GNU. Также показывает колл-граф! команда gprof, и вам нужно скомпилировать код с некоторым параметром.

0 голосов
/ 10 октября 2010

Есть ли способ сбросить стек вызовов в запущенном процессе на C или C ++ при каждом вызове определенной функции?

Нет, нет, хотя решения для платформы могут существовать.

...