Bochs调试加载符号文件的问题
1. Bochs中的調(diào)試命令ldsym沒有觸發(fā)的情況。
參考:http://www.ibm.com/developerworks/cn/linux/sdk/lex/
Lex 代表 Lexical Analyzar。Yacc 代表 Yet Another Compiler Compiler
?
參考:http://www.cnblogs.com/cuishengli/p/3346148.html
?
Bison/Flex/YaccRefer: http://en.wikipedia.org/wiki/GNU_bisonhttp://en.wikipedia.org/wiki/Flex_lexical_analyserhttp://www.cnblogs.com/me115/archive/2010/10/27/1862180.html?.l與.y文件的大致格式類似,都是以%%開分隔符,將整個(gè)文件分成幾個(gè)區(qū),其中最重要的都是規(guī)則定義區(qū)。 ?查看到lexer.l中相關(guān)語句: ldsym { bxlval.sval = strdup(bxtext); return(BX_TOKEN_LOAD_SYMBOLS); }??parser.y中相關(guān)語句:
1: symbol_command: 2: BX_TOKEN_LOAD_SYMBOLS BX_TOKEN_STRING '\n' 3: { 4: bx_dbg_symbol_command($2, 0, 0); 5: free($1); free($2); 6: } 7: | BX_TOKEN_LOAD_SYMBOLS BX_TOKEN_STRING BX_TOKEN_NUMERIC '\n' 8: { 9: bx_dbg_symbol_command($2, 0, $3); 10: free($1); free($2); 11: } 12: | BX_TOKEN_LOAD_SYMBOLS BX_TOKEN_GLOBAL BX_TOKEN_STRING '\n' 13: { 14: bx_dbg_symbol_command($3, 1, 0); 15: free($1); free($2); free($3); 16: } 17: | BX_TOKEN_LOAD_SYMBOLS BX_TOKEN_GLOBAL BX_TOKEN_STRING BX_TOKEN_NUMERIC '\n' 18: { 19: bx_dbg_symbol_command($3, 1, $4); 20: free($1); free($2); free($3); 21: } 22: ;可見,ldsym會(huì)被lexer解析成BX_TOKEN_LOAD_SYMBOLS,而ldsym的一般語法為ldsym str, 即 1: | BX_TOKEN_HELP BX_TOKEN_LOAD_SYMBOLS '\n' 2: { 3: dbg_printf("ldsym [global] <filename> [offset] - load symbols from file\n"); 4: free($1);free($2); 5: }當(dāng)我們輸入:
1: <bochs:1> ldsym linux.sym 2: :1: syntax error at 'linux' 3: <bochs:2>因此,是BX_TOKEN_STRING解析有問題:
1: \'([^\\\'\n]|(\\.))*\' | /* throw away leading and trailing \" */ 2: \"([^\\\"\n]|(\\.))*\" { bxlval.sval = strdup(bxtext+1); bxlval.sval[strlen(bxlval.sval)-1] = 0; return(BX_TOKEN_STRING); }可見,這里是需要將string用引號(hào)括起來的,因此我們嘗試:
1: <bochs:2> ldsym "linux.sym" 2: <bochs:3>這回成功了。
?
我們?cè)O(shè)置斷點(diǎn),
1: <bochs:3> lb "start_kernel" 2: <bochs:4> c 3: (0) Breakpoint 1, 0x00000000c17bc411 in ?? () 4: Next at t=605611780 5: (0) [0x0000017bc411] 0060:00000000c17bc411 (start_kernel+0): push ebp ; 55 6: <bochs:5> s 7: Next at t=605611781 8: (0) [0x0000017bc412] 0060:00000000c17bc412 (start_kernel+1): mov ebp, esp ; 89e5 9: <bochs:6> s 10: Next at t=605611782 11: (0) [0x0000017bc414] 0060:00000000c17bc414 (start_kernel+3): push ebx ; 53 12: <bochs:7> s 13: Next at t=605611783 14: (0) [0x0000017bc415] 0060:00000000c17bc415 (start_kernel+4): sub esp, 0x00000018 ; 83ec18 15: <bochs:8> s 16: Next at t=605611784 17: (0) [0x0000017bc418] 0060:00000000c17bc418 (start_kernel+7): call .-22 (0xc17bc407) ; e8eaffffff 18: <bochs:9> s 19: Next at t=605611785 20: (0) [0x0000017bc407] 0060:00000000c17bc407 (smp_setup_processor_id+0): push ebp ; 55 21: <bochs:10> 22:? 23:?這回調(diào)試內(nèi)核變得友好多了。
?
2. 在VS2012環(huán)境下為什么總會(huì)出現(xiàn)CL.exe錯(cuò)誤
先使用如下方法查看CL.read1.log被哪些進(jìn)程占用
參考:
openfiles用于查看各個(gè)進(jìn)程所打開的文件。windows自帶工具。必須先用openfiles /local on 命令啟用系統(tǒng)全局標(biāo)志“維護(hù)對(duì)象列表”;再重啟后執(zhí)行openfiles查看各進(jìn)程文件。http://blog.csdn.net/laurawan/article/details/8080240直接調(diào)試parser.c/lexer.c時(shí),無法設(shè)置斷點(diǎn)。
解決方法:將所有#line行都注釋掉。
3. 根據(jù)System.map生成符號(hào)文件
?
如何通過System.map得到Bochs支持的符號(hào)文件?
1: $ sudo cp /boot/System.map-3.0.0-12-generic System.map 2: $ sudo awk '{print "0x"$1,$3}' System.map | sudo tee linux.sym 3:??
4. 編寫debug腳本,自動(dòng)化調(diào)試過程
Bochs支持debug腳本,我們可以編寫如下腳本:
daniel@ubuntu:~/bochs/symbolbank$ cat bxrc_triumph
daniel@ubuntu:~/bochs/symbolbank$ cat script_debug
daniel@ubuntu:~/bochs/symbolbank$ cat debug.sh
daniel@ubuntu:~/bochs/symbolbank$ sudo bash ./debug.sh
這樣就可以讓Bochs直接跑到start_kernel處再停下來
轉(zhuǎn)載于:https://www.cnblogs.com/long123king/p/3568575.html
總結(jié)
以上是生活随笔為你收集整理的Bochs调试加载符号文件的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu 14.04 FTP服务器-
- 下一篇: KMP算法~看的清楚~