Gprof показывает обычные функции в приложении, вызванные с <spontaneous> - PullRequest
4 голосов
/ 21 апреля 2020

Итак, я уже год пишу переводчик как сторонний проект. Сегодня я наконец-то решил впервые проверить его работоспособность! Может быть, я должен был сделать это раньше ... оказывается, что запуск функции Фибоначчи на языке занимает x600 времени эквивалентной Python программы. Whoopsy Daisy.

Во всяком случае ... Я приступил к профилированию. В графе вызовов gprof рассматривает несколько функций (а именно критических) как вызванные из <spontaneous>. Это проблема, потому что понимание того, что вызывает эти функции чаще всего, поможет мне.

Я скомпилировал проект в целом так:

gcc *.c -o app.exe -g -pg -O2 -Wall -Wno-unused -LC:/msys64_new/mingw64/lib -lShlwapi

Я использую gprof примерно так:

gprof app.exe > gprofoutput.txt

Поскольку это интерпретатор языка, многие из этих функций (все они?) Могут быть вызваны как часть цепочки взаимной рекурсии. Возможно ли, что это проблема? Если да, можно ли доверять gprof этой программе вообще?

Функции, вызываемые <spontaneous>, компилируются как часть *.c файлов проекта и не вызываются внешним библиотека или что-нибудь, о чем я знаю.

Поскольку я проверил это, другие ответы на SO, касающиеся <spontaneous>, не решили мою проблему. Что может вызывать появление этих функций как вызванных из <spontaneous> и как я могу это исправить?

Пример gprof output (_mcount_private и __fentry__, конечно, не имеют значения - включая их здесь в случае это дает любые подсказки):

index % time    self  children    called     name
                                                 <spontaneous>
[1]     46.9    1.38    0.00                 _mcount_private [1]
-----------------------------------------------
                                                 <spontaneous>
[2]     23.1    0.68    0.00                 __fentry__ [2]
-----------------------------------------------
                                                 <spontaneous>
[3]     18.7    0.06    0.49                 object_string_new [3]
                0.17    0.24 5687901/5687901     cell_table_set_value [4]
                0.00    0.08 5687901/7583875     make_native_function_with_params [7]
                0.00    0.00 13271769/30578281     parser_parse [80]
-----------------------------------------------
                0.17    0.24 5687901/5687901     object_string_new [3]
[4]     14.1    0.17    0.24 5687901         cell_table_set_value [4]
                0.12    0.05 5687901/5930697     table_set_value_directly [6]
                0.02    0.04 5687901/7341054     table_get_value_directly [9]
                0.01    0.00 5687901/5930694     object_cell_new [31]
-----------------------------------------------
                                                 <spontaneous>
[5]      7.0    0.07    0.14                 vm_interpret_frame [5]
                0.01    0.05 1410341/1410345     cell_table_get_value_cstring_key [13]
                0.01    0.02  242786/242794      cell_table_set_value_cstring_key [19]
                0.02    0.00 3259885/3502670     object_thread_pop_eval_stack [22]
                0.01    0.00  242785/242786      value_array_free [28]
                0.00    0.01  242785/242785      vm_call_object [34]
                0.00    0.00  681987/1849546     value_compare [32]
                0.00    0.00  485570/31306651     table_init [20]
                0.00    0.00  242785/242788      cell_table_free [38]
                0.00    0.00  242785/25375951     cell_table_init [29]
                0.00    0.00       1/1           object_load_attribute [50]
                0.00    0.00       1/1           object_load_attribute_cstring_key [52]
                0.00    0.00       1/2           object_user_function_new [56]
                0.00    0.00       2/33884613     copy_cstring [17]
                0.00    0.00       1/5687909     object_function_set_name [25]
                0.00    0.00       1/17063722     copy_null_terminated_cstring [23]
                0.00    0.00       1/72532402     allocate [21]
                0.00    0.00 3502671/3502671     object_thread_push_eval_stack [81]
                0.00    0.00 1167557/1167557     object_as_string [85]
                0.00    0.00  681988/681995      two_bytes_to_short [86]
                0.00    0.00  485572/485578      value_array_make [88]
                0.00    0.00  242786/242786      object_thread_push_frame [96]
                0.00    0.00  242786/242786      object_thread_peek_frame [95]
                0.00    0.00  242785/242785      object_thread_pop_frame [97]
                0.00    0.00  242785/485571      vm_import_module [89]
                0.00    0.00       2/1167575     object_value_is [83]
-----------------------------------------------

..... etc .........

Я использую Mingw-w64 G CC на Windows 7.

1 Ответ

2 голосов
/ 27 апреля 2020

С Руководство по gprof :

Если невозможно определить личность абонентов функции, выдается фиктивная строка вызывающего абонента, в которой `'в качестве" имя вызывающего абонента "и все остальные поля не заполнены. Это может произойти для обработчиков сигналов.

Похоже, имя вашего абонента неизвестно gprof. Если какой-либо потенциальный вызывающий абонент (включая asyn c dispatch, если вы используете его) компилируется без символов, имена вызывающих абонентов не будут известны. Какие сторонние библиотеки вы используете? Можете ли вы получить отладочные символы для них?

Вы можете получить Windows пакетов символов , хотя я не знаю, какие библиотеки покрыты. На этой странице также обсуждается использование сервера символов Microsoft вместо загрузки (возможно устаревших) пакетов символов.

...