2015-03-13 2 views
1

Я хочу профилировать свою программу не по соображениям производительности, а для того, чтобы увидеть логику программы. Если функция А вызывает В, то С и D было бы что-то вроде:C++ - профилирование, чтобы получить обзор вызываемых функций

A -> B 
    -> C -> E 
     -> F 
    -> D 

В настоящее время я использую Valgrind/callgrind. Это очень полезно, но не соответствует точно моему требованию. Мы не видим всех разных столов, и мы не видим, в каком порядке вызываются функции. Например, если у нас есть также F-> G (но не в контексте стека A-> C-> F), мы не будем делать это различие, мы видим только вызывающих/вызываемых лиц. Я в среде Unix. Спасибо за вашу помощь,

Christophe

ответ

0

Я не знаю, хороший инструмент для этого, кроме активизации кода в отладчике. Если вы используете хорошую среду IDE, например Visual Studio, возможно, есть функциональные кнопки для перехода (F10), в (F11) и выходы (shift-F11) вызовов функций. Если вы используете отладчик, такой как GDB, команды: n, s и fin.

Вы можете обнаружить, что это занимает больше времени, чем у вас есть терпение. В этом случае я продолжу его (F5 в VS, c в GDB), а затем приостановит его (приостановить в VS, Ctl-C в GDB) и отобразит стек вызовов, чтобы увидеть, где он находится и почему он там , Я делаю это несколько раз. Если я хочу, я могу шагнуть вперед от этой точки на некоторое время. Это дает мне хорошее представление о том, как программа проводит большую часть своего времени и почему.

Я не знаю ни одного другого инструмента, который передаст такую ​​информацию на скомпилированном языке, таком как C++. Упомянутые языки могут содержать трассировку , которая отслеживает все вызовы функций, но, как я уже говорил, громкость может быть огромной.

профайлер как дргоЕ может быть в состоянии дать вам граф вызовов, который вы могли бы быть в состоянии объединить с ступая, чтобы дать вам временную последовательность. Имейте в виду, что он не будет включать какие-либо операции ввода/вывода, ожидания или другие ожидания системы, но он может быть полезен.