Bochs调试加载符号文件的问题
1. Bochs中的调试命令ldsym没有触发的情况。
参考: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/Yacc
Refer: http://en.wikipedia.org/wiki/GNU_bison
http://en.wikipedia.org/wiki/Flex_lexical_analyser
http://www.cnblogs.com/me115/archive/2010/10/27/1862180.html
.l与.y文件的大致格式类似,都是以%%开分隔符,将整个文件分成几个区,其中最重要的都是规则定义区。
查看到lexer.l中相关语句:
ldsym { bxlval.sval = strdup(bxtext); return(BX_TOKEN_LOAD_SYMBOLS); }parser.y中相关语句:
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会被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: }当我们输入:
1: <bochs:1> ldsym linux.sym2: :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用引号括起来的,因此我们尝试:
1: <bochs:2> ldsym "linux.sym"
2: <bochs:3>这回成功了。
我们设置断点,
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: 这回调试内核变得友好多了。
2. 在VS2012环境下为什么总会出现CL.exe错误
先使用如下方法查看CL.read1.log被哪些进程占用
参考:
openfiles用于查看各个进程所打开的文件。windows自带工具。必须先用openfiles /local on 命令启用系统全局标志“维护对象列表”;再重启后执行openfiles查看各进程文件。http://blog.csdn.net/laurawan/article/details/8080240
直接调试parser.c/lexer.c时,无法设置断点。
解决方法:将所有#line行都注释掉。
3. 根据System.map生成符号文件
如何通过System.map得到Bochs支持的符号文件?
1: $ sudo cp /boot/System.map-3.0.0-12-generic System.map2: $ sudo awk '{print "0x"$1,$3}' System.map | sudo tee linux.sym
3:
4. 编写debug脚本,自动化调试过程
Bochs支持debug脚本,我们可以编写如下脚本:
daniel@ubuntu:~/bochs/symbolbank$ cat bxrc_triumph
ata0-master: type=disk, path="triumph.img", cylinders=50, heads=16, spt=63#gdbstub:enabled=1, port=1234
boot:disk
log: log.txt
debugger_log: log_debug.txt
daniel@ubuntu:~/bochs/symbolbank$ cat script_debug
ldsym "linux.sym"lb "start_kernel"lb "rest_init"lb "kernel_init"lb "init_post"c
u /20
r
sreg
x/16bx eax
daniel@ubuntu:~/bochs/symbolbank$ cat debug.sh
#/bin/sh
bochs -q -f bxrc_triumph -rc script_debug
daniel@ubuntu:~/bochs/symbolbank$ sudo bash ./debug.sh
这样就可以让Bochs直接跑到start_kernel处再停下来

浙公网安备 33010602011771号