国产免费观看拍拍拍_国产精品一区欧美日韩不卡在线_午夜小视频欧美三级在线_免费看美女全身的软件中文字幕_人妻少妇456在线视频_中文字幕a视频直播_亚洲精品无码18_精品国产亚洲一区人成在线_91热爆亚洲精品首页_久久 国产 人妖 系列

全國服務(wù)熱線 : 4000-020-230

當(dāng)前位置:首頁 > 技術(shù)支持 > 技術(shù)文章

技術(shù)文章 產(chǎn)品知識 下載中心

技術(shù)文章

歐視邁(OZEAM)全數(shù)字可視對講系統(tǒng)程序調(diào)試技巧
發(fā)布日期:2012-03-03 15:12:43     作者:    已有  閱讀過本文

      摘要:本文闡述了在歐視邁(OZEAM)全數(shù)字可視對講系統(tǒng)程序調(diào)試過程中通過map(映射文件)和cod(程序集、機(jī)器碼、源代碼)文件查找異常地址的方法和應(yīng)用技巧

      關(guān)鍵詞:程序異常 全數(shù)字可視對講系統(tǒng) 歐視邁 OZEAM 異常地址 map cod

 

      我們在研發(fā)歐視邁(OZEAM)全數(shù)字可視對講系統(tǒng)程序時(shí),經(jīng)常會(huì)遇到程序異常的情況。在程序異常時(shí),通常通過debug調(diào)試的方法找原因。在非調(diào)試的模式下或者實(shí)際應(yīng)用中,程序出現(xiàn)崩潰,當(dāng)程序比較復(fù)雜,通過查看代碼不容易查出問題。

      在evc和vs2005的工具中,可以通過生成map(映射文件)和cod(程序集、機(jī)器碼、源代碼)文件查找異常地址。map可定位在發(fā)生崩潰的函數(shù),code文件可定位在具體函數(shù)中的某一行。

      在evc中配置設(shè)置如下

    (1)生成Cod文件:在Project->Setting->C/C++->Listing file type中,選擇Assembli,Machine Code,and Source。如圖1.1.

圖1.1

 

    (2)生成Map文件:在Project->Setting->Link中,在Generate mapfile選項(xiàng)中打勾。如圖1.2

圖1.2

 

       在vs2005中配置設(shè)置如下

      (1)生成Cod文件:在屬性->配置屬性->C/C++->輸出文件中,選擇程序集、機(jī)器碼和原代碼(/FAcs)。如圖1.3

圖1.3

 

     (2)生成Map文件:在屬性->配置屬性->鏈接器->調(diào)試->生成映射文件選擇是(/NAP).如圖1.4

圖1.4

 

    設(shè)置該2項(xiàng)后,編譯工程,會(huì)生成.cod和.map文件。這些文件就是用來查找異常地址。

 

    下面舉個(gè)例子:

 

 void CHelloDlg::Fun(char *pbuf)

{

     *pbuf = 1;

}

 

// CHelloDlg 消息處理程序

 

BOOL CHelloDlg::OnInitDialog()

{

     CDialog::OnInitDialog();

 

     // 設(shè)置此對話框的圖標(biāo)。當(dāng)應(yīng)用程序主窗口不是對話框時(shí),框架將自動(dòng)

     //  執(zhí)行此操作

     SetIcon(m_hIcon, TRUE);          // 設(shè)置大圖標(biāo)

     SetIcon(m_hIcon, FALSE);         // 設(shè)置小圖標(biāo)

 

     // TODO: 在此添加額外的初始化代碼

     char *p = 0;

     Fun(p);

    

     return TRUE;  // 除非將焦點(diǎn)設(shè)置到控件,否則返回TRUE

}

 

    很容易看出來,在函數(shù)Fun中pbuf是參數(shù)p沒有申請空間,所以*pbuf = 1會(huì)異常。

     所以在運(yùn)行時(shí)出現(xiàn)如下異常:

PC=0001119c(Hello.exe+0x0000119c) RA=00011194(Hello.exe +0x00001194) SP=0004f620, BVA=00000000

 

     這里面最關(guān)鍵的信息是PC和RA給出的地址信息。PC就是上面提到的崩潰地址,根據(jù)這個(gè)地址可以定位到導(dǎo)致崩潰的源代碼行;RA是PC的返回地址(Return Address),根據(jù)這個(gè)地址可以找到導(dǎo)致崩潰的上一級函數(shù)。除了PC和RA,其他信息也可以提供一些參考作用:BVA是ARM中的Fault Address Register(FAR),是引起Data Abort的虛擬地址,比如說你的程序試圖訪問一個(gè)非法地址里的內(nèi)容,那么Data Abort時(shí)BVA就是這個(gè)非法地址;FSR是Fault Status Register,指明導(dǎo)致異常的原因。

 

     1、查找異常的函數(shù):

     打開Hello.map文件,內(nèi)容如下(截取部分)

  Address         Publics by Value              Rva+Base       Lib:Object

0001:0000015c       ?DoDataExchange@CHelloDlg@@MAAXPAVCDataExchange@@@Z 0001115c f   HelloDlg.obj

 0001:0000015c       ?Serialize@CObject@@UAAXAAVCArchive@@@Z 0001115c f   Hello.obj

 0001:0000015c       ?OnBnClickedButton1@CHelloDlg@@QAAXXZ 0001115c f   HelloDlg.obj

 0001:0000015c       ?DoDataExchange@CWnd@@MAAXPAVCDataExchange@@@Z 0001115c f   HelloDlg.obj

 0001:00000160       ?OnInitDialog@CHelloDlg@@MAAHXZ 00011160 f   HelloDlg.obj

 0001:000001a8       ?GetMessageMap@CHelloDlg@@MBAPBUAFX_MSGMAP@@XZ 000111a8 f   HelloDlg.obj

 0001:000001b4       ?GetMessageMap@CWinApp@@MBAPBUAFX_MSGMAP@@XZ 000111b4 f   uafxcw:appcore.obj

 0001:000001b4       ?GetThisMessageMap@CWinApp@@KAPBUAFX_MSGMAP@@XZ 000111b4 f   uafxcw:appcore.obj

 0001:000001c0       ?_LoadSysPolicies@CWinApp@@IAAHXZ 000111c0 f   uafxcw:appcore.obj

 0001:000002e4       ?InitApplication@CWinApp@@UAAHXZ 000112e4 f   uafxcw:appcore.obj

 0001:00000370       ??1CWinApp@@UAA@XZ         00011370 f   uafxcw:appcore.obj

 0001:000004bc       ?ExitInstance@CWinApp@@UAAHXZ 000114bc f   uafxcw:appcore.obj

 

通過異常地址0001119c,找到最相近的2個(gè)地址

OnInitDialog@CHelloDlg@@MAAHXZ 00011160 f   HelloDlg.obj

GetMessageMap@CHelloDlg@@MBAPBUAFX_MSGMAP@@XZ 000111a8 f   HelloDlg.obj

以上2個(gè)地址表示函數(shù)的起始地址,所以直接看HelloDlg,異常的地址在HelloDlg .obj的CHelloDlg的OnInitDialog。相應(yīng)的代碼在HelloDlg.cod

 

2、查找異常的行號

異常地址為0001119c,減去起始地址00011160,得0x3c。

異常地址的上一層函數(shù)地址為00011194,減去起始地址00011160,得0x34。

打開HelloDlg.cod,部分內(nèi)容如下

 

; 48   :

; 49   : // TODO: 在此添加額外的初始化代碼

; 50   : char *p = 0;

 

  00034  e3a02000         mov         r2, #0

 

; 51   : FunOSAD(p);

 

  00038  e3a03001         mov         r3, #1

  0003c   e5c23000          strb        r3, [r2]

 

; 52   :

; 53   : return TRUE;  // 除非將焦點(diǎn)設(shè)置到控件,否則返回 TRUE

 

(說明:48是行號,00034是十六進(jìn)制地址)

根據(jù)0x3c,可找到0003c      e5c23000          strb        r3, [r2],往上看,可以知道在FunOSAD中異常了。第51行。即*pbuf = 1;這一行。

 

上一層地址0x34,可找到上一級函數(shù)00034     e3a02000         mov         r2, #0,往上看可知道上一級地址為char *p = 0;,第50行。

 

以上方法成功應(yīng)用于歐視邁(OZEAM)全數(shù)字可視對講系統(tǒng)、智能家居系統(tǒng)程序的研發(fā)過程,使產(chǎn)品更加穩(wěn)定。


返回
上一篇  語音導(dǎo)航操作在歐視邁(OZEAM)全數(shù)字可視對講系統(tǒng)中的應(yīng)用
下一篇  如何辨別真假全數(shù)字可視對講系統(tǒng)?
【推薦閱讀】

24小時(shí)全國服務(wù)熱線:4000-020-230

關(guān)注我們:
?2016 廣州市歐智智能科技有限公司 版權(quán)所有.All Rights Reserved.      粵ICP備10043508號-1
網(wǎng)絡(luò)支持:艾迪品牌策劃設(shè)計(jì)
尊敬的客戶,您是第【{visits:all}】訪客
業(yè)務(wù)服務(wù)
客服電話

4000-020-230