分享到plurk 分享到twitter 分享到facebook

版本 7e239e6d7b75b9f68d4c66591b1f45f001961be6

embedded/Lab27

Changes from 7e239e6d7b75b9f68d4c66591b1f45f001961be6 to ff742725084eb7fff07afb531a981bf662f48b1e

---
title: Lab27: Debugger
toc: no
...

預期目標
-------
- 學習使用 Debugger,並且理解從硬體到軟體相關的處理機制
- 學習 Linux 工具和 GNU Toolchain 的使用
- 學習 Automation 技巧

QEMU + GDB 操作
----------------
- 假設 `Lab-25</embedded/Lab25>`_ 所使用 QEMU 的目錄已放在 workspace 目錄

.. code-block:: prettyprint

  cd workspace
  file qemu_stm32

- 取得 GDB Automation

.. code-block:: prettyprint

  git clone git://github.com/embedded2013/gdb-automation.git
  git clone git@github.com:embedded2013/gdb-automation.git # 如果上一行失敗
  cd gdb-automation

- 開啟一個終端機,作以下輸入

.. code-block:: prettyprint

    make qemudbg

- 開啟另一個終端機,準備透過 gdb 來追蹤程式。下列 (gdb) 開頭的指令表示在 GDB 內部操作
- 使用 Ubuntu 64-bit 版本時,需要另外安裝 lib32ncurses5
  - sudo apt-get install lib32ncurses5

.. code-block:: prettyprint

    cd gdb-automation
    arm-none-eabi-gdb
    (gdb) file main.elf 
    Reading symbols from gdb-automation/main.elf...done.
    (gdb) b main
    Breakpoint 1 at 0x2206: file main.c, line 8.
    (gdb) target remote :3333
    Remote debugging using :3333
    Reset_Handler ()
        at libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.s:67
    67	  movs	r1, #0
    (gdb) c
    Continuing.
    
    Breakpoint 1, main () at main.c:8

GDB Automation
---------------
* 目標:使用 GDB 來驗證 rtenv 功能,特別是新加入的 shell command
* 取得 rtenv-gdbautomation 並編譯、執行驗證

.. code-block:: prettyprint

    git clone git@github.com:embedded2014/rtenv-gdbautomation.git
    git clone http://github.com/embedded2014/rtenv-gdbautomation.git # 如果上一行失敗
    cd rtenv-gdbautomation
    make check

* 可以看到如下方輸出

.. code-block:: prettyprint

    arm-none-eabi-gdb -batch -x test-export_envvar.in
    first () at kernel.c:791
    791		while(1);
    Breakpoint 1 at 0x5b84: file unit_test.c, line 4.
    Current environment variables:
    Name: EDITOR; Value: gedit
    Name: PATH; Value: ~
    Name: LC_ALL; Value: UTF8
    Processed argv list:
    #0 export
    #1 EDITOR=vi
    Pass: exported value is correct
    Pass: correct value of env_count

* 研究 test-export_envvar.in 檔案的設計,發現是 GDB script
  - source qemudbg_init.in # 可發現 GDB macro
  - set logging on

參考作業要求
------------------
* 將 rtenv-gdbautomation 機制移植回去 `Lab-25</embedded/Lab25>`_ 的 rtenv,使得 ``make check`` 時,可以透過 GDB script 自動測試之前加入的功能、函式,並且比對預期輸出,作為 unit test
* [加分] 用 GDB script 顯示執行時期資訊

作業繳交方式
------------------
* 請更新作業提案到共筆網站: `Lab 27 / 作業共筆<https://embedded2014.hackpad.com/Lab-27-GDB-Automation-L1ohwuTnRMw>`_
  - 需要標注自己的 ID,可參考 `Lab 25 / 作業共筆<https://embedded2014.hackpad.com/Lab25-GNU-Toolchain-iqMI18AAgwU>`_ 的格式
* 請在 Mar 14, 2014 前,將符合作業提案的程式碼,提交到 `Lab-25</embedded/Lab25>`_ 時 fork 出來的 rtenv
  - https://github.com/embedded2014/rtenv

參考資訊
-------
- debugger 和 software emulator
  * opencsl.openfoundry.org/Lab05_debugger.rst.html
  * http://www.cis.nctu.edu.tw/~is92004/article/gdb.htm

- GDB 筆記
  * http://loda.hala01.com/2012/04/gdb%E7%AD%86%E8%A8%98/

- 以 GDB 重新學習 C 語言程式設計
  * http://www.slideshare.net/jserv/clang-usinggdb

- GDB Manual
  * http://sourceware.org/gdb/current/onlinedocs/gdb/
  * Commands, Remote Debugging, Extending GDB