2012-03-03 3 views
17

Как мы можем перечислить все функции, вызываемые в приложении. Я попытался использовать GDB, но его список backtrace только до вызова основной функции.Список всех вызовов функций, выполненных в приложении

Мне нужен более подробный список i.e список всех функций, вызываемых основной функцией и вызываемой функцией от этих вызываемых функций и т. Д.

Есть ли способ получить это в gdb? Или вы могли бы дать мне предложения о том, как это сделать?

+0

С помощью любого инструмента: http://stackoverflow.com/questions/311840/tool-to-trace-local-function-calls-in-linux?lq=1 –

+0

Возможный дубликат [Сделать GDB контроль печати потока функций, как они называются] (http://stackoverflow.com/questions/311948/make-gdb-print-control-flow-of-functions-as-they-are-) – jww

+0

https://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/ –

ответ

17

Как мы можем перечислить все функции, которые вызываются в приложении

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

Вы можете узнать все функции , определенные (но не обязательно называемые) в приложении с помощью команды nm, например.

nm /path/to/a.out | egrep ' [TW] ' 

Вы можете также использовать GDB, чтобы установить точку останова на каждой функции:

(gdb) set logging on  # collect trace in gdb.txt 
(gdb) set confirm off # you wouldn't want to confirm every one of them 
(gdb) rbreak .   # set a breakpoint on each function 

После того, как вы продолжите, вы попали в точку останова для каждой вызываемой функции. Используйте команды disable и continue для перемещения вперед. Я не верю, что есть простой способ автоматизировать это, если вы не хотите использовать скрипты Python.

Уже упоминалось gprof - еще один хороший вариант.

+0

Примечание: это также нарушит код, который выполняется до '_start': http : //stackoverflow.com/questions/31379422/why-is-init-from-glibcs-csu-init-first-c-called-before-start-even-if-start-i –

+0

gdb сидит на 100% cpu, так как я ввел команду 'rbreak .' –

+0

без регистрации,' set height 0' будет полезен (без вывода подкачки для вывода) – Blauhirn

9

Вам нужен граф вызовов. Инструмент, который вы хотите использовать, не является gdb, это gprof. Вы скомпилируете свою программу с помощью -pg, а затем запустите ее. Когда он запустит файл gmon.out, будет выпущен. Затем вы обрабатываете этот файл с помощью gprof и наслаждаетесь выходом.

1

Этот вопрос, возможно, нуждается в разъяснении, чтобы решить, между тем, что в настоящее время 2 ответа. Зависит от того, что вам нужно:

1) Вам нужно знать, сколько раз каждая функция вызывается в прямом списке/графическом формате функций, соответствующих # вызовам. Это может привести к неоднозначным/неубедительным результатам, если ваш код не является процедурным (т. Е. Функции, вызывающие другие функции в структуре ветвления без двусмысленности того, что вызывает то, что). Это базовая функция gprof, которая требует перекомпиляции с флагом -pg.

2) Вам нужен список функций в том порядке, в котором они были вызваны, это зависит от вашей программы, которая является наилучшей/выполнимой опцией: a) Если ваша программа запускается и завершается без ошибок времени выполнения, вы можете использовать gprof для этой цели. b) Опция ELSE выше с использованием dbg с регистрацией и точкой останова - это вариант слева, который я узнал, прочитав это.

3) Вам нужно знать не только порядок, но, например, аргументы функции для каждого вызова. Моя текущая работа - это моделирование в физике переноса частиц, поэтому это было бы полезно для отслеживания, когда происходят аномальные результаты ... т. Е. Когда передаваемые аргументы перестают иметь смысл.Я полагаю, один из способов сделать это будет вариацией на тему того, что предприятие была Россия, за исключением использования следующий:

(GDB) Информация ARGS

Logging результатов этой команды с каждой точкой излома (заданный при каждом вызове функции) дает аргументы текущей функции.

4

запись вызовов функций-история

https://sourceware.org/gdb/onlinedocs/gdb/Process-Record-and-Replay.html

Это должно быть большое аппаратное ускорение возможность, если вы один из немногих людей (2015) с центральным процессором, который поддерживает Intel Processor Tracing (Intel PT, intel_pt в /proc/cpuinfo).

GDB документы утверждают, что он может производить вывод, как:

(gdb) list 1, 10 
1 void foo (void) 
2 { 
3 } 
4 
5 void bar (void) 
6 { 
7  ... 
8  foo(); 
9  ... 
10 } 
(gdb) record function-call-history /ilc 
1 bar  inst 1,4  at foo.c:6,8 
2 foo inst 5,10 at foo.c:2,3 
3 bar  inst 11,13 at foo.c:9,10 

Перед использованием необходимо запустить:

start 
record btrace 

который где не способен CPU терпит неудачу с:

Target does not support branch tracing. 

Поддержка процессора дополнительно обсуждается по адресу: How to run record instruction-history and function-call-history in GDB?

Связанные темы:

Для встроенных, вы также рассмотреть JTAG и поддерживающий аппаратное обеспечение, как ARM-х DSTREAM, но поддержка x86 кажется, не очень хорошо: debugging x86 kernel using a hardware debugger

Смежные вопросы