<output id="txsrp"><track id="txsrp"></track></output>
<output id="txsrp"><nobr id="txsrp"></nobr></output>
    1. <code id="txsrp"></code>
    2. <ins id="txsrp"><video id="txsrp"><optgroup id="txsrp"></optgroup></video></ins>
      1. <ruby id="txsrp"><option id="txsrp"></option></ruby>

      2. <tr id="txsrp"><nobr id="txsrp"></nobr></tr>
        全國服務熱線 : 4000-020-230

        當前位置:首頁 > 技術支持 > 技術文章

        技術文章 產品知識 下載中心

        技術文章

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

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

              關鍵詞:程序異常 全數字可視對講系統 歐視邁 OZEAM 異常地址 map cod

         

              我們在研發歐視邁(OZEAM)全數字可視對講系統程序時,經常會遇到程序異常的情況。在程序異常時,通常通過debug調試的方法找原因。在非調試的模式下或者實際應用中,程序出現崩潰,當程序比較復雜,通過查看代碼不容易查出問題。

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

              在evc中配置設置如下

            (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選項中打勾。如圖1.2

        圖1.2

         

               在vs2005中配置設置如下

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

        圖1.3

         

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

        圖1.4

         

            設置該2項后,編譯工程,會生成.cod和.map文件。這些文件就是用來查找異常地址。

         

            下面舉個例子:

         

         void CHelloDlg::Fun(char *pbuf)

        {

             *pbuf = 1;

        }

         

        // CHelloDlg 消息處理程序

         

        BOOL CHelloDlg::OnInitDialog()

        {

             CDialog::OnInitDialog();

         

             // 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動

             //  執行此操作

             SetIcon(m_hIcon, TRUE);          // 設置大圖標

             SetIcon(m_hIcon, FALSE);         // 設置小圖標

         

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

             char *p = 0;

             Fun(p);

            

             return TRUE;  // 除非將焦點設置到控件,否則返回TRUE

        }

         

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

             所以在運行時出現如下異常:

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

         

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

         

             1、查找異常的函數:

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

          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個地址

        OnInitDialog@CHelloDlg@@MAAHXZ 00011160 f   HelloDlg.obj

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

        以上2個地址表示函數的起始地址,所以直接看HelloDlg,異常的地址在HelloDlg .obj的CHelloDlg的OnInitDialog。相應的代碼在HelloDlg.cod

         

        2、查找異常的行號

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

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

        打開HelloDlg.cod,部分內容如下

         

        ; 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;  // 除非將焦點設置到控件,否則返回 TRUE

         

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

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

         

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

         

        以上方法成功應用于歐視邁(OZEAM)全數字可視對講系統、智能家居系統程序的研發過程,使產品更加穩定。


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

        24小時全國服務熱線:4000-020-230

        關注我們:
        ?2016 廣州市歐智智能科技有限公司 版權所有.All Rights Reserved.      粵ICP備10043508號-1
        網絡支持:艾迪品牌策劃設計
        尊敬的客戶,您是第【{visits:all}】訪客
        業務服務
        客服電話

        4000-020-230

        国产精品自产拍在线观看免费

        <output id="txsrp"><track id="txsrp"></track></output>
        <output id="txsrp"><nobr id="txsrp"></nobr></output>
        1. <code id="txsrp"></code>
        2. <ins id="txsrp"><video id="txsrp"><optgroup id="txsrp"></optgroup></video></ins>
          1. <ruby id="txsrp"><option id="txsrp"></option></ruby>

          2. <tr id="txsrp"><nobr id="txsrp"></nobr></tr>