authon:baohaitao
date: 2016-11-25
目的:linux應用軟體執行過程**現難重現的無規律宕機,在core檔案中gdb中除錯沒有發現有價值資訊;這裡給出了另乙個思路:函式打樁。該方法特別適合於中小型嵌入式軟體。
設計:(2)增加乙個編譯項:編譯器自動在整個工程的所有函式體頭尾增加插樁函式;
(4)編譯伺服程式和應用程式;
(5)同時啟動伺服程式和應用程式;
使用方法:
總共分兩部分,如下:
第一部分:程式**調整
(1)應用程式增加編譯項「
-finstrument-functions」比如:在qt的pro檔案中,如下:
qmake_cxxflags =
-finstrument-functions -dfl_library -d_largefile_source
-d_largefile64_source -d_file_offset_bits=64 -d_thread_safe
-d_reentrant
(2)應用程式在應用工程的源**中增加檔案func_trace.h和func_trace.c,並調整makefile參與編譯;
(3)呼叫函式插樁 main函式中呼叫初始化語句:「cyg_profile_init();」,並在頭部引用標頭檔案「#include
"func_trace.h"」;
(4)伺服程式 根據執行環境,編譯traceshm.c,生產伺服程式「traceshm」;注意:在執行應用程式的同時,一定要啟動伺服程式(但增加引數,如:「traceshm
init」);
(5)調整解析指令碼解析指令碼"conv.sh"中的解析函式需要和交叉編譯工具關聯,開啟該指令碼,修改「addr2line」內容為當前交叉編譯器所在路徑,如下所示:
#addr2line=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-addr2line#addr2line=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-linux-addr2lineaddr2line=addr2line
第二部分:宕機後如何定位(在linux終端中操作)
(1)發現宕機再次執行traceshm(但不帶引數),此時將會在/tmp目錄下,生成traceshm.txt檔案(裡面記錄了宕機前的函式位址資訊);
(2)解析函式保持三者(traceshm.txt,應用程式,呼叫指令碼)在同一目錄,建議:新建乙個解析目錄"/trace_dir",將/tmp/traceshm.txt拷貝到該目錄,呼叫「conv.sh」進行解析,以應用程式名為kt5000為例,呼叫方式如下:#./conv.sh
kt5000此時會得到解析資訊,類似如下:
enter
qcleanupresources_calculatorbuilder__dest_class__::~qcleanupresources_calculatorbuilder__dest_class__()
qrc_calculatorbuilder.cpp:127
enter
qcleanupresources_calculatorbuilder()
qrc_calculatorbuilder.cpp:121
enter
calculatorform::calldump()
calculatorform.cpp:94
exit
main main.cpp:46
附錄:使用到的檔案清單
(1)conv.sh
(解析指令碼)
(2)func_trace.c/func_trace.h
(插樁函式)
(3)traceshm.c
(伺服程式)
面試準備勿重「難」輕「易」
眼下,有些大中專畢業生在做應聘面試準備時,往往把事情想得太複雜,把用人單位考官提出的問題想得過於難,於是在做面試準備時重 難 輕 易 把精力都放在了高難度問題上,而忽視了基礎性的理論和技術知識。因而在應聘面試時,對容易的基礎知識考題反而會出現 大智若愚 式的差錯。其實,做應聘面試準備,僅靠幾天的時間...
set 去重原理
眾所周知,set 是 python 中的 天然去重因子 對一串資料如 lyst 1,1,2,4,4 我們常常 set 一下,也就是 set lyst 達到去重目的。那麼,set 是如何去重的呢?為了貼合實際的開發需求,我們常需要自定義資料結構。拿通用示例 student 來說。class stude...
音訊重取樣函式
經驗證,在armv4上32000 44100轉8000hz取樣率 效率不錯.contributed by paul flinders void x audio out resample mono int16 t input samples,uint32 t in samples,int16 t ou...