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.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用引号括起来的,因此我们尝试:

   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.map
   2: $ 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处再停下来

转载于:https://www.cnblogs.com/long123king/p/3568575.html

Bochs调试加载符号文件的问题相关推荐

  1. Visual Studio调试/加载速度很慢

    本文翻译自:Visual Studio debugging/loading very slow I'm at wits end. 我的智慧结束了. Visual Studio is typically ...

  2. Google浏览器限制网速调试加载速度

    问题 项目中,我们测试的时候有时需要限制网速,来看各种情况下的加载感受. 解决办法 Google浏览器 F12 打开开发者工具. Network面板可以设置网络的通信方式. 默认正常模式.这里可以设置 ...

  3. 使用Bochs调试Linux内核初级入门

    之所以能用Bochs调试Linux内核,还是因为Bochs做了一些工作: 安装完成以后如下:如果使用bochs.exe加载操作系统映像,就是在虚拟机中运行操作系统: 如果使用bochsdbg.exe加 ...

  4. Bochs调试Linux内核

    总结:cmd进入Bochs安装路径后运行如下命令bochsdbg  -q -f bochsrc.bxrc 调试的命令主要包括: vbreak  地址 打断点,配合c执行到该地址 info r      ...

  5. ajaxsubmit怎么显示加载中_电脑绝技教你怎么优化第一宇宙Visual Studio编辑器性能...

    虽然Visual Studio很好用,但是太大了,运行速度也相对慢一些,正对的起它的第一宇宙编辑器的称号.下面就来说说怎么优化下它的速度吧!我以我的VS2017为例如子 一升级到最新版,微软会优化性能 ...

  6. 计算机中丟失Slc.dll,调试符号不会加载slc.dll和sppc.dll

    这是我的情况.我正在尝试在远程服务器上调试WCF服务(Windows 2012 R2 Standard).我在运行Visual Studio 12的Windows 7专业系统上.在弄清楚如何安装远程调 ...

  7. 关于VS调试时的加载符号

                前两天安装了VS2017,随便写了几行代码测试下,发现调试时要有一大堆的加载符号,像[已加载"D:\SogouInput\Components\PicFace\1.1 ...

  8. WKWebView Safari调试、JS互调、加载进度条、JS中alert、confirm、prompt

    主要内容 Safari调试 swift/OC与JS互调 增加加载进度条 支持JS中alert.confirm.prompt Safari调试 设置 -> safari --> 高级,开启J ...

  9. win7下一次加载和调试sys驱动程序的过程以及捕捉到内核打印字符串函数的输出

    这是以前做的: 构建出一个.sys驱动以后,用工具加载,然后查看内核打印函数DbgPrint或KdPrintEx的输出: 工具网上都有: 有些选项要设置: 加载和调试.捕获的过程:并不是每次都会加载s ...

最新文章

  1. 自学大数据:用以生产环境的Hadoop版本比较
  2. 卓越只值1.5亿RMB?
  3. thymeleaf如何迭代遍历,如何判断
  4. Git从零教你入门(4):Git服务之 gogs部署安装
  5. 【CCCC】L2-020 功夫传人 (25分),,模拟水题,多叉树的存储与遍历
  6. ASCII码对照表(emoji表情符号)
  7. 在线考试系统的时间控制(倒计时)
  8. OSChina 周一乱弹 ——女人比代码复杂多了,搞不懂!
  9. 7-20 打印九九口诀表(15 分)
  10. 项目经理必备工具之Project软件操作秘籍︱高远华信公司总经理张会斌
  11. 百度奖学金获得者徐立恒:执着创造价值
  12. ArcGIS教程:创建面积图
  13. 【JAVA】生产者消费者模式
  14. SQL Server备份恢复
  15. Unity新手适合的简单AI
  16. c#考试,答题系统制作(窗体)
  17. matlab制作gif表情
  18. vc_redist 静默安装的方法
  19. CC2640之TIRTOS添加IIC配置
  20. 模拟退火法和蚂蚁优化算法求解TSP问题(Matlab代码实现)

热门文章

  1. 提高mysql千万级大数据SQL查询优化30条经验
  2. Android中设置RecyclerView的每一个item的单项点击事件
  3. Android中使用Notification在状态栏上显示通知
  4. Java中int转Double再转换成百分数并应用在求同比昨日增长率
  5. vue中使用moment来实现导出excel时添加格式化的时间戳
  6. #软件配置管理#之坏味道搜集
  7. 有关数组的运算 (sizeof)(strlen)
  8. 7-20上午刷题未知点集合
  9. 视频 + PPT | 财富管理转型,券商如何精细化运营?
  10. 硅谷蓝图创始人 Patrick:数据驱动规模化增长