函式打樁原理 難重現問題定位「函式打樁」

2021-10-17 06:29:23 字數 1904 閱讀 9889

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...