命令 | 功能 |
---|---|
ctrl+c | 暫停程序的運行 |
c | 繼續程序的運行 |
b | 添加函數斷點(參數能夠是源代碼中的行號或者一個函數名) |
p | 打印某個量的值或者執行一個函數調用 |
for example: app
gdb YOUR_PROGRAM // 啓動 gdb 並選擇你的程序爲 gdb 的啓動目標
(gdb)b main1.c:num // 對應於耗時模塊的起始點
(gdb)b main1.c:num // 對應於耗時模塊的終止點
(gdb)r // 運行
(gdb)p ProfilerStart("MyProfile")
(gdb)c // 繼續程序運行
(gdb)p ProfilerStop() async
這兩個函數能夠在任意兩個點之間開始和結束,只要你的程序能捕捉到更多的點,隨意添加都不會有太大的爲題。 函數
四,分析結果 工具
1, pprof --text ./your_execute_file ./MyProfile 性能
Using local file ./bin/nbd_google_pertools_n. 網站
Using local file asyn_profile_2. google
Removing _L_unlock_16 from all stack traces. spa
Total: 30 samples .net
2 6.7% 6.7% 2 6.7% *__GI___libc_malloc 調試
1 3.3% 10.0% 1 3.3% *__GI___libc_free
1 3.3% 13.3% 1 3.3% _List_impl
1 3.3% 16.7% 1 3.3% _Vector_impl
1 3.3% 20.0% 1 3.3% __fdatasync_nocancel
1 3.3% 23.3% 1 3.3% __gnu_cxx::new_allocator::construct
1 3.3% 26.7% 1 3.3% __gnu_cxx::new_allocator::destroy
1 3.3% 30.0% 1 3.3% __mutex_alloc (inline)
1 3.3% 33.3% 1 3.3% __pthread_mutex_lock
1 3.3% 36.7% 1 3.3% boost::detail::shared_count::swap
1 3.3% 40.0% 1 3.3% boost::shared_ptr::operator->
1 3.3% 43.3% 1 3.3% boost::unordered_detail::hash_table::find
1 3.3% 46.7% 2 6.7% exec_implement::print_implement
1 3.3% 50.0% 1 3.3% execution_base::begin_incoming_ins_call
1 3.3% 53.3% 1 3.3% memcpy
......................................
具體每一項的意思你能夠去查下tutorial
2, pprof --callgrind ./your_execute_file ./MyProfile >you_prifiler.callgrind
kcachegrind you_profiler.callgrind
注意事項:
因爲perftools使用的是SIGPROF信號的handler來獲取stack信息的,你的程序不能屏蔽signal,不然會出現如下狀況:PROFILE: interrupts/evictions/bytes = 0/0/64,文件天然就不會有任何內容,由於我當初遇到過這樣的問題,望各位不要重蹈覆轍。