嵌入式大廠面經(jīng)gdb常見面試題(持續(xù)更新中?。?/h1>
這是一個嵌入式大廠面試題專欄,每天更新高頻面試題。專欄將包含題目描述、詳細解析、相關知識點擴展以及實際代碼示例。內(nèi)容涵蓋操作系統(tǒng)、驅(qū)動開發(fā)、通信協(xié)議等核心領域,并結(jié)合實際項目經(jīng)驗進行分析。每道題目都會附帶面試官可能的追問方向,幫助大家更好地準備面試!
GDB調(diào)試工具常見面試題解析
GDB(GNU Debugger)是GNU軟件系統(tǒng)中的標準調(diào)試器,廣泛應用于C/C++程序的調(diào)試。以下是GDB相關的常見面試題及詳細解析:
1. GDB基礎知識
Q: 什么是GDB?它的主要功能是什么?
答:GDB是GNU項目開發(fā)的一個強大的程序調(diào)試工具,主要功能包括:
- 運行程序:可以設置運行參數(shù),控制程序的執(zhí)行環(huán)境
- 設置斷點:在指定位置暫停程序執(zhí)行
- 單步執(zhí)行:逐行或逐過程執(zhí)行程序
- 檢查變量:查看和修改程序中的變量值
- 查看調(diào)用棧:分析程序的執(zhí)行路徑
- 監(jiān)視表達式:跟蹤表達式值的變化
- 多線程調(diào)試:支持多線程程序的調(diào)試
- 遠程調(diào)試:支持對遠程設備上的程序進行調(diào)試
2. GDB常用命令
Q: 列舉GDB中最常用的調(diào)試命令及其功能
答:GDB常用命令及功能:
- 啟動和退出:gdb program:啟動GDB并加載程序quit/q:退出GDB
- 運行控制:run/r [args]:運行程序,可帶參數(shù)start:運行程序,在main函數(shù)處停止continue/c:繼續(xù)執(zhí)行程序next/n:單步執(zhí)行(不進入函數(shù))step/s:單步執(zhí)行(進入函數(shù))finish:執(zhí)行到當前函數(shù)返回until/u:執(zhí)行到指定行
- 斷點操作:break/b [location]:設置斷點watch [expr]:設置觀察點info breakpoints:查看所有斷點delete [num]:刪除指定斷點disable/enable [num]:禁用/啟用斷點condition [num] [expr]:設置條件斷點
- 查看程序狀態(tài):print/p [expr]:打印表達式的值display [expr]:每次停止時顯示表達式的值info locals:顯示局部變量backtrace/bt:顯示調(diào)用棧frame/f [num]:切換棧幀list/l:顯示源代碼
- 修改程序狀態(tài):set var [var]=[value]:修改變量值return [expr]:強制函數(shù)返回
# GDB命令使用示例 gdb ./myprogram (gdb) b main (gdb) r (gdb) n (gdb) p variable_name (gdb) bt (gdb) c (gdb) q
3. 斷點和觀察點
Q: GDB中的斷點類型有哪些?如何設置條件斷點?
答:GDB中的斷點類型及設置方法:
- 普通斷點:break function_name:在函數(shù)入口處設置斷點break filename:line_number:在指定文件的指定行設置斷點break +offset/-offset:在當前行的前/后offset行設置斷點break *address:在內(nèi)存地址處設置斷點
- 條件斷點:break location if condition:只有當條件滿足時才觸發(fā)斷點condition breakpoint_num expression:為已存在的斷點添加條件
- 觀察點:watch expression:當表達式的值改變時停止rwatch expression:當表達式被讀取時停止awatch expression:當表達式被讀取或修改時停止
- 捕獲點:catch event:捕獲特定事件,如異常拋出、信號等
# 條件斷點示例 (gdb) break 10 if i == 5 (gdb) break func1 if strcmp(str, "test") == 0 # 觀察點示例 (gdb) watch global_var (gdb) rwatch *pointer (gdb) awatch array[index]
4. 多線程調(diào)試
Q: 如何使用GDB調(diào)試多線程程序?
答:GDB多線程調(diào)試的主要命令和技巧:
- 查看線程:info threads:顯示所有線程信息thread thread_id:切換到指定線程
- 線程控制:set scheduler-locking off/on/step:控制調(diào)試時其他線程的運行 off:所有線程都正常運行on:只有當前線程運行step:單步時只有當前線程運行,continue時所有線程運行
- 線程斷點:break location thread thread_id:為特定線程設置斷點break location thread thread_id if condition:為特定線程設置條件斷點
- 線程組命令:thread apply all command:對所有線程執(zhí)行命令thread apply thread_id_list command:對指定線程執(zhí)行命令
# 多線程調(diào)試示例 (gdb) info threads (gdb) thread 2 (gdb) set scheduler-locking on (gdb) break thread_func thread 2 (gdb) thread apply all bt
5. 遠程調(diào)試
Q: 如何使用GDB進行遠程調(diào)試?特別是嵌入式系統(tǒng)的調(diào)試?
答:GDB遠程調(diào)試的步驟和方法:
- 遠程調(diào)試架構(gòu):目標板運行g(shù)dbserver或遠程stub主機運行GDB客戶端,通過網(wǎng)絡或串口連接
- 連接方式:TCP/IP連接:target remote ip_address:port串口連接:target remote /dev/ttyS0
- 嵌入式系統(tǒng)調(diào)試:使用JTAG/SWD接口連接調(diào)試器通過OpenOCD等工具建立GDB與目標的連接使用交叉編譯的GDB版本
- 常用命令:file executable:加載可執(zhí)行文件符號target remote host:port:連接遠程目標load:將程序下載到目標內(nèi)存monitor command:發(fā)送命令到調(diào)試器
# 遠程調(diào)試示例(目標板) $ gdbserver :1234 ./myprogram # 遠程調(diào)試示例(主機) $ arm-none-eabi-gdb (gdb) file myprogram (gdb) target remote 192.168.1.100:1234 (gdb) load (gdb) continue
6. 內(nèi)存調(diào)試
Q: 如何使用GDB檢查內(nèi)存和調(diào)試內(nèi)存問題?
答:GDB內(nèi)存調(diào)試的主要命令和技巧:
- 內(nèi)存檢查命令:x/nfu addr:檢查內(nèi)存內(nèi)容 n:要顯示的單元數(shù)f:顯示格式(x十六進制,d十進制,u無符號,o八進制,t二進制,c字符,s字符串)u:單元大?。╞字節(jié),h半字,w字,g雙字)info proc mappings:查看進程內(nèi)存映射
- 內(nèi)存斷點:watch -l expression:監(jiān)視內(nèi)存位置而非變量rwatch -l expression:監(jiān)視內(nèi)存讀取awatch -l expression:監(jiān)視內(nèi)存讀寫
- 內(nèi)存泄漏調(diào)試:結(jié)合Valgrind等工具使用使用set environment MALLOC_CHECK_=2檢測堆錯誤
- 內(nèi)存修改:set {type}address = value:修改指定地址的內(nèi)存值
# 內(nèi)存檢查示例 (gdb) x/10xb buffer # 以十六進制顯示buffer開始的1
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買
嵌入式面試八股文全集 文章被收錄于專欄
這是一個全面的嵌入式面試專欄。主要內(nèi)容將包括:操作系統(tǒng)(進程管理、內(nèi)存管理、文件系統(tǒng)等)、嵌入式系統(tǒng)(啟動流程、驅(qū)動開發(fā)、中斷管理等)、網(wǎng)絡通信(TCP/IP協(xié)議棧、Socket編程等)、開發(fā)工具(交叉編譯、調(diào)試工具等)以及實際項目經(jīng)驗分享。專欄將采用理論結(jié)合實踐的方式,每個知識點都會附帶相關的面試真題和答案解析。