浅析IBM i上C/C++应用程序编译调试方法
軟件調試對于編程人員來說有著非常重要的意義,應用程序功能的開發和完善是在不斷調試中完成的。本文圍繞IBM i上C/C++語言的編譯調試問題進行分析和介紹。主要介紹兩方面的內容:一是system i上C/C++源程序編譯方法,二是C/C++程序在system i上的調試方法。IBM i上編輯應用程序代碼可以選擇綠屏或者其他平臺編輯后上傳的方式,這里采用windows 端自選編輯器編輯示例程序test.c,然后通過FTP將源文件傳輸到system i上編譯調試的方式。假設已通過此方式將C的源文件bubbleSort.c、bubbleFun.c、bubbleMain.c上傳到目錄/myApp下。
一 C/C++源程序編譯方法
System i上編譯C/C++應用程序采用ILE的程序模型,源文件首先被編譯成MODULE對象,Module對象可以連接生成PGM對象和SRVPGM對象。為便于理解,可以將Windows平臺的obi、exe、dll類型對照到IBM i的MODULE、PGM、SRVPGM對象。這里需要注意,一個PGM可以鏈接一個或者多個MODULE和SRVPGM,一個SRVPGM同樣可以鏈接多個MODULE和不同的SRVPGM。下面首先介紹MODULE的創建方法,然后根據生成的MODULE介紹如何創建PGM和SRVPGM。在介紹創建MODULE、PGM、SRVPGM詳細步驟中,僅對本文涉及到的參數項進行解釋說明,其他選項的詳細信息可參閱IBM info center。
? 創建MODULE
a)綠屏命令行下輸入“CRTCMOD”,按F4提示功能鍵。準備調用ILE C編譯器。
MODULE:待編譯源文件生成的目標MODULE名。
Library:生成的MODULE放置的目標庫名。
Source stream file:源代碼所在的IFS路徑。填寫源文件的位置時可以采用IFS文件路徑或QSYS.LIB MBR文件的方式(須填寫Source file、library和Source member),本例采用文件IFS路徑。
Text 'description': 該MODULE的描述信息(非必填信息)。
本例中上述選項所填的信息如下圖所示,其中APP為系統中之前創建的library。
二 C/C++綠屏調試方法
下面介紹IBM I 上C/C++應用程序綠屏環境下的調試方法。調試方法可以按照調試過程中JOB的個數簡單分為兩種類型,單job調試和兩個job之間聯合調試。所謂單job調試是指被調試的PGM對象在當前的JOB中運行和調試。所謂兩個job之間聯調是指被調試的PGM對象在當前job中調試,但在另外一個job中運行。通過啟動特定的服務job監控調用被調試PGM的job,服務job負責綁定并觸發綠屏調試界面。下面分別進行闡述。
? IBM i綠屏下單job調試
在一個job中調試PGM是C/C++應用程序調試的最簡單情況,它的基本原理可以概括為:啟動待調試的PGM源碼 → 在源碼上設置斷點 → 退出源碼界面 → 觸發待調試的PGM → 調試 → 關閉。詳細步驟如下:
a) 啟動待調試PGM。
綠屏命令行下執行“STRDBG APP/BUBBLE”啟動待調試的PGM源碼(BUBBLE為上文生成
的PGM對象),源代碼調試界面如圖所示:
b) 按F10 → PageDown功能鍵。
Output options: 表示是否產生相應的編譯listing結果信息,該信息可顯示編譯的選項設置、過程和結果用以更正程序語法錯誤。選擇*PRINT代表在SPOOL FILE中生成編譯信息,通過WRKSPLF命令查看該文件。
Title: 生成的listing文件的主標題,最大80字符。用于標識生成的文件。
Subtitle: 生成的listing文件的副標題,最大80字符。
本例中上述選項所填信息如下圖所示:
c)按PageDown功能鍵。
Debugging view:控制如何編譯帶有調試信息的程序,*SOURCE表示編譯生成的調試信息中帶有源代碼的路徑,調試時可以自動找到并顯示源代碼,但源代碼的路徑在編譯后不可以移到其他地方。*STMT表示生成的調試信息中不包含源代碼的位置信息,但包含源程序語句序號的信息。用戶可以根據過程名和語句編號來設置斷點。*LIST表示編譯生成的調試信息中包含完整的源代碼清單,編譯完成后,該源代碼清單與源程序文件沒有直接關系,屬于不同的副本,故源代碼的路徑可以更改。其編譯出的程序源代碼尺寸較前兩種大。此處我們填寫為*ALL,同時生成前面三種調試信息。
本例中Debugging view 填寫*ALL, 未涉及的選項標簽在本例中為默認設置。
d)正確填寫以上信息后按回車鍵。
若源代碼書寫正確編譯成功,將在所填寫的庫位置產生相應的帶有debug信息的TESTMODULE *MODULE對象。若編譯出錯,可到spool File中查找BUBBLE文件根據錯誤的提示修改源碼,重復上述編譯步驟。
? 創建PGM
應用上面生成的MODULE BUBBLE對象創建PGM方法如下:
a) 綠屏命令行下輸入CRTPGM,按F4提示功能鍵。
Program: 待生成的PGM名。
Library: 生成的程序所放置的目標位置庫名。
Module: 生成該PGM所需要的MODULE,可以填寫一個或多個MODULE。
Library : 所添MODULE的位置庫名。
Text 'description':待生成的PGM的描述信息。
本例中上述選項所填信息如下圖所示:
b)按F10 → PageDown功能鍵。
此處介紹下Bind service program相關選項,當綁定 SRVPGM時需要填寫下面信息。
Service program:綁定的SRVPGM名字。
Library:綁定的SRVPGM所在的庫。
Activation:激活服務程序的方式。*IMMED代表調用應用程序時立即激活服
務程序,*DEFER表示當應用程序調用到服務程序導出的過程時再加載。我們生成的第一個PGM中不包含SRVPGM,上述信息不填,采用默認值。后文調試SRVPGM時,需要自行創建綁定有待調試SRVPGM的PGM。c++源文件生成MODULE的命令是CRTCPPMOD,生成PGM命令仍為CRTPGM。
? 創建SRVPGM
System i上ILE SRVPGM不能獨立運行,但可以被其他SRVPGM和PGM調用。一般創建SRVPGM所需的MODULE對象的源文件不包含main()函數。創建SRVPGM前首先創建MODULE,命名為BUBBLESRV,方法與前文介紹的相同,注意開啟DEBUG參數。接下來在綠屏下輸入CRTSRVPGM,按F4提示功能鍵。
Service program:待生成的目標SRVPGM名稱。
Library: 待生成的SRVPGM所在的庫名字。
Module:生成該SRVPGM所鏈接的MODULE名字。一個SRVPGM可以鏈接一個或多個MODULE。
Library:被鏈接的MODULE所在的庫名字。
Export: 標識此SRVPGM導出的函數或者數據。可以通過源文件標識特定的導出函數或者數據,此時需要填寫Export source file,Library,Export source member。也可以填寫*ALL,表示MODULE中導出的的所有函數和數據在生成的SRVPGM中也將全部導出。
本例中上述選項所填信息如下圖所示:
快捷鍵對應的命令可以參照下表:
| 功能 ? | 快捷鍵 ? | 命令 ? |
| 顯示所有支持的Debug命令 ? | F1 ? | HELP ? |
| 光標當前行設置為斷點 ? | F6 ? | BREAK ? |
| 單步執行,跳過函數。 ? | F10 ? | STEP ? |
| 顯示光標所在處變量的值 ? | F11 ? | EVAL ? |
| 運行到下一個斷點 ? | F12 ? | NEXT ? |
| 查看當前模塊的所有斷點 ? | F13 ? | NO ? |
| 查看module列表 ? | F14 ? | NO ? |
| 切換視圖模式 ? | F15 ? | NO ? |
| 查看調用棧 ? | F21 ? | NO ? |
| 單步執行,進入函數內部 ? | F22 ? | STEP INTO ? |
| 查看輸出窗口 ? | F23 ? | WATCH ? |
? IBM i綠屏下兩個Job聯合調試
上面的調試屬于在一個job內完成調試工作,但在實際應用中很多待調試程序以服務程序對象SRVPGM方式存在所以如何調用SRVPGM、如何觸發DEBUG調試器是調試SRVPGM的關鍵。IBM i上利用服務JOB來調試ILE程序或者ILE服務程序,調試器和被調試程序將位于不同的JOB中,即兩個job間聯合調試。其基本原理是:作為服務job B連接到job A,服務job B負責設置斷點和調試程序。而調試程序的觸發則是在job A中完成的。詳細的調試步驟為:
a)編譯帶有調試信息的ILE服務程序。
創建MODULE:CRTCMOD MODULE(APP/SRVMOD)
SRCSTMF('/myApp/bubbleFun.c') OUTPUT(*PRINT) DBGVIEW(*ALL)
創建SRVPGM:CRTSRVPGM SRVPGM(APP/SRV)
MODULE(APP/SRVMOD) EXPORT(*ALL)
b) 編譯帶有調試信息的調用ILE服務程序的PGM。
創建MODULE:CRTCMOD MODULE(APP/SRVP) SRCSTMF('/myApp/bubbleMain.c') OUTPUT(*PRINT) DBGVIEW(*ALL)
創建PGM:CRTPGM PGM(APP/BUBBLEMAIN) MODULE(APP/SRVP) BNDSRVPGM((APP/SRV *IMMED))
c) 啟動綠屏終端A,A中將會觸發調試的服務程序。
d) 啟動另一個綠屏終端B,在終端B中通過STRSRVJOB命令來捕獲終端A中觸發的服務程序。該命令有Job name、User、Number三個參數需要填寫,代表需要被監控的終端A上的作業。終端A上shift+ESC回車,選擇3,即可顯示A上終端作業 h) 在終端B中,利用上文介紹的PGM對應的調試命令進行調試。
i) 調試結束后,終端B中按下F3或者F12功能鍵退出調試器。在終端B中,命令行下執行“ENDDBG”退出調試模式。在終端B中,命令行下執行“ENDSRVJOB”,結束終端B對終端A中作業的調試。
以上介紹了System i上C/C++應用程序綠屏編譯調試MODULE、PGM、SRVPGM的基本方法,在實際應用中,應用程序的編譯還需考慮很多因素。由于篇幅所限,很多詳細的編譯選項未全部闡述,讀者可以根據上述編譯命令查閱相關文檔自行嘗試。綠屏調試是system i調試的一種方式,GUI方式調試具有更好的人機交互界面,有興趣的讀者可以嘗試。
轉載于:https://www.cnblogs.com/zhangyoushugz/archive/2012/11/07/2758315.html
總結
以上是生活随笔為你收集整理的浅析IBM i上C/C++应用程序编译调试方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 删除驱动符号链接出错-变量作用域和Rtl
- 下一篇: VS2008序列号