簡體   English   中英

Gprof 顯示應用程序中調用的常規函數<spontaneous></spontaneous>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM