Linux 0.11 實驗環境搭建與除錯
緣起
之前我寫過一篇博文:Linux 0.11 實驗環境搭建
本以為有了這個環境(gcc-3.4 & gdb-6.8),就可以除錯無憂了。誰知遇到了以下問題:
(1)用 gdb 除錯 main 函式的時候,無法輸出變數的值。總是提示:
No symbol “XXX” in current context.
(2)雖然在編譯時為 gcc 加上了-gdwarf-2 -g3
這兩個選項,但仍然無法檢視巨集的定義。
如下圖所示:
對於(1),因為有-g
選項,所以 gcc 編譯後確實生成了相關符號,但為什麼 gdb 總說找不到符號呢?因為 gdb 版本過低,對於較高版本的 gcc 產生的符號表,它根本不認識,所以說找不到符號。解決辦法就是升級 gdb.
對於(2),我本以為原因同(1)。把 gdb 升級到 8.1 還是不行,看來另有原因。
我寫了一個小程式,gcc-5.4.0 配合 gdb-8.1,除錯時可以列印巨集的值,info macro xxx
等命令沒有問題。所以,我打算用高版本的 gcc 編譯 Linux-0.11.
問題來了,Linux-0.11 已經是很古老的程式碼了,用高版本的 gcc 根本編譯不過,怎麼辦呢?好在有很多前輩勇於探索,修改了原始碼和 Makefile,使得 Linux-0.11 可以被高版本的 gcc 編譯通過。
環境搭建
他山之石,可以攻玉。搜了一波後,發現了一個叫“泰曉科技”的網站,其官網是http://tinylab.org/,官方程式碼倉庫是 https://github.com/tinyclub
程式碼倉庫裡面有個專案——Linux 0.11 Lab
下載原始碼
得到linux-0.11-lab-master.zip
檔案,解壓後進入目錄linux-0.11-lab-master
,如下圖:
用make help
命令可以檢視幫助資訊。
—– Linux 0.11 Lab (http://tinylab.org/linux-0.11-lab) —–
:: Compile ::
make –generate a kernel floppy Image with a fs on hda1
make clean – clean the object files
make distclean – only keep the source code files
:: Test ::
make start – start the kernel in vm (qemu/bochs)
make start-fd – start the kernel with fs in floppy
make start-hd – start the kernel with fs in hard disk
make start-hd G=0 – start with curses based terminal, instead of SDL
:: Debug ::
make debug – debug the kernel in qemu/bochs & gdb at port 1234
make debug-fd – debug the kernel with fs in floppy
make debug-hd – debug the kernel with fs in hard disk
make debug DST=boot/bootsect.sym – debug bootsect
make debug DST=boot/setup.sym – debug setup
make boot BOCHS=bochs-debugger VM=bochs – debug with bochs internal debugger
make switch – switch the emulator: qemu and bochs
make boot VM=qemu|bochs – switch the emulator: qemu and bochs
:: Read ::
make cscope – genereate the cscope index databases
make tags – generate the tag file
make cg – generate callgraph of the default main entry
make cg f=func d=dir|file b=browser – generate callgraph of func in file/directory
:: More ::
>>> README.md <<<
~ Enjoy It ~
—–Linux 0.11 Lab (http://tinylab.org/linux-0.11-lab)—–
—> Linux Kernel Lab (http://tinylab.org/linux-lab) <—
安裝一些軟體
這裡以 Linux Ubuntu 作業系統為例。作者推薦用 docker.
The docker install method is recommended for all systems, including Linux, Windows and Mac OS.
不過我沒有用 docker,還是用比較原始的辦法。
Here is the deprecated method:
The Linux distributions: debian and ubuntu (>= 14.04) are recommended
Install basic tools
$ sudo apt-get install vim cscope exuberant-ctags build-essential qemu lxterminal
Optional
$ sudo apt-get install bochs vgabios bochsbios bochs-doc bochs-x >libltdl7 bochs-sdl bochs-term $ sudo apt-get install graphviz cflow
編譯
在linux-0.11-lab-master
目錄下,執行make
命令.
執行
$ make start
採用 qemu 或者 bochs 模擬器執行 Linux-0.11,如果想切換模擬器,可以用
$ make switch
除錯
$ make debug
執行後出現如下介面:
再開一個終端,還是在linux-0.11-lab-master
目錄下,執行命令
$ gdb --quiet src/kernel.sym
這時候,就可以用 gdb 的各種命令進行除錯了。
如何檢視巨集
正如 GDB 官網上說:
We pass the
-gdwarf-2
and-g3
flags to ensure the compiler includes information about preprocessor macros in the debugging information.
所以,先要給 gcc 新增 -gdwarf-2
和-g3
選項。對於本實驗環境,就是修改src 目錄下的 Makefile.head 檔案。為第 29 行的CFLAGS
加上 -gdwarf-2 -g3
。
如圖:
之後重新編譯,再次除錯。
在除錯的時候,可以用p(print)
命令檢視巨集的值,還可以用
info macro 巨集名
例如:
【參考資料】
https://sourceware.org/gdb/onlinedocs/gdb/Macros.html
https://github.com/tinyclub/linux-0.11-lab/blob/master/README.md
相關文章
- Linux下搭建FFmpeg開發除錯環境Linux除錯
- 利用QEMU+GDB搭建Linux核心除錯環境Linux除錯
- windbg 搭建雙擊除錯環境除錯
- vs搭建遠端除錯環境除錯
- MAC環境下PHP開發除錯環境搭建MacPHP除錯
- linux環境下vscode 中C/C++編譯及除錯環境的搭建LinuxVSCodeC++編譯除錯
- 搭建Ansible實驗環境
- risc-v環境搭建及除錯除錯
- step 1 :搭建開發除錯環境除錯
- Flutter開發環境搭建和除錯Flutter開發環境除錯
- RocketMQ系列-搭建Namesrv原始碼除錯環境MQ原始碼除錯
- Linux 環境安裝 Xdebug 進行除錯Linux除錯
- vscode+gdbserver遠端除錯ARM環境搭建VSCodeServer除錯
- uni-app 模擬機除錯環境搭建APP除錯
- [實用] 如何配置 iview 除錯環境View除錯
- Redis原始碼漂流記(二)-搭建Redis除錯環境Redis原始碼除錯
- 死磕Spring之IoC篇 - 除錯環境的搭建Spring除錯
- iOS開發之runtime(一):runtime除錯環境搭建iOS除錯
- Linux搭建Java環境LinuxJava
- 鏈路追蹤 SkyWalking 原始碼分析 —— 除錯環境搭建原始碼除錯
- hyperf配置yasd除錯環境除錯
- Linux學習環境搭建Linux
- Linux系統環境搭建Linux
- Linux搭建開發環境Linux開發環境
- Linux(二十)搭建JavaEE環境LinuxJava
- Linux環境下C++除錯的三板斧LinuxC++除錯
- MacOs/Liunx主機搭建windows平臺雙機除錯環境MacWindows除錯
- 輕鬆兩步,搭建斷點除錯 PHP 原始碼環境斷點除錯PHP原始碼
- 訊息中介軟體 RocketMQ 原始碼解析 —— 除錯環境搭建MQ原始碼除錯
- 訊息中介軟體RocketMQ原始碼解析-- --除錯環境搭建MQ原始碼除錯
- 阿里雲體驗實驗室 教你如何《搭建Hadoop環境》阿里Hadoop
- 阿里雲體驗實驗室 教你《快速搭建Docker環境》阿里Docker
- 阿里雲體驗實驗室教程《快速搭建LAMP環境》阿里LAMP
- Linux環境下段錯誤的產生原因及除錯方法小結Linux除錯
- (一)Linux環境的學習環境的搭建Linux
- 分散式事務 TCC-Transaction 原始碼分析 —— 除錯環境搭建分散式原始碼除錯
- Mac下Android Framework原始碼環境搭建執行及除錯方法MacAndroidFramework原始碼除錯
- 閘道器 Spring-Cloud-Gateway 原始碼解析 —— 除錯環境搭建SpringCloudGateway原始碼除錯