[英]Gprof shows regular functions in the app as called from <spontaneous>
所以 - 一年來,我一直在寫一個語言解釋器作為一個副項目。 今天我終於決定第一次測試它的性能。 也許我應該早點這樣做......結果以該語言運行斐波那契 function 需要 x600 倍的等效 Python 程序的時間。 百日菊。
無論如何...我要去分析了。 在調用圖中, 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
文件的一部分,並且不被外部庫或我知道的任何東西調用。
因為我已經檢查過了,所以關於<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 .........
我在 Windows 7 上運行 Mingw-w64 GCC。
從gprof 手冊:
如果無法確定 function 的呼叫者的身份,則打印一個虛擬呼叫者行,其中“呼叫者的姓名”為“呼叫者的姓名”,所有其他字段為空白。 這可能發生在信號處理程序上。
gprof 似乎不知道您的來電者姓名。 如果任何潛在的調用者(包括異步調度,如果你正在使用的話)編譯時沒有符號,調用者的名字將是未知的。 您使用的是哪些第三方庫? 你能得到它們的調試符號嗎?
您可以獲得Windows 符號包,但我不知道涵蓋了哪些庫。 該頁面還討論了使用 Microsoft 的符號服務器而不是下載(可能已過時)符號包。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.