gdb下断点串行的问题

前言

今天遇到编译程序后,用 gdb -tui –args ./my_demo demo_s_param_list 进入程序后,下断点串行的问题。串行就是要在A行代码下断点,结果程序运行起来后,命中后,断点在A+N行的位置。更奇怪的是,有时断点下好后,日志打印出来了,但是断点没命中。实际上已经运行到了下断点的代码处。

以前也遇到过此类问题,只是串一行,不太影响。今天串行太厉害了,单步调试完全没感觉了。

问题排查

  • 将程序完全编译(clear掉,再build)
  • gdb -tui –args ./my_demo demo_s_param_list 进入程序后, list my_class::my_member_fun 显示要下断点的函数内容。
  • break my_class::my_member_fun , 看到下的断点向下偏了4,5行,如果正确的话,应该断在第一行代码处(函数入口处注释下的实际的第一行代码)。这和命中时,看到的断点串行情况时一样的。还有可能断点串行后,断点已经经过,但是不命中. 表面现象看起来很难理解。

  • 按翻页键,一直翻到类实现的最上面。

  • 尝试从第一个类成员函数开始下断点 e.g. break my_class::my_class , 看到断点不在第一句代码上,就停下来(构造函数会停在函数定义处,析构函数会显示有2处断点,这是正常的)。
  • 用vi打开类实现my_class.cpp, 跳到出现偏差的行号上(e.g. 下断点出现偏差的行号为123,就执行 123gg)
  • 跳到了偏差行,就能看到代码中夹杂了2个不可见字符,用x键删掉即可, wq保存。
  • 再重新编译,运行gdb -tui … , 再重新在出现偏差的成员函数上下断点,可以看到断点已经下载指定行数上了。

总结

问题出现的原因:
* 我在win10下使用SI来编辑代码,使用系统自带的中文输入法,使用的SI文件设置为UNIX换行和GB2312的代码页,因为要写代码和写中文注释,按住SHIFT来切换中英文, 不知道是不是SI的BUG. 在写英文代码时,在代码里面加入了不可见字符。
e.g. 要写的代码为 MYLOG_D(“this->m_l_entry_cnt = %ld”, this->m_l_entry_cnt);
在MYLOG_D(和”this->m_l_entry_cnt =之间就出现了2个不可见字符(在linux环境下查看, win10中的SI看不出来).
在debian8.8下用VI打开看,就是2个^M^M.
在debian8.8下用gdb list 看,出现了2个回车. 像下面这样
MYLOG_D(

    "this->m_l_entry_cnt = %ld", "this->m_l_entry_cnt);

但是在win10中SI打开后,确实正常的.只能看到是正常完整的一行代码.
因为着急,暂时在win10下,用SI将my_class.cpp保存成了ascii utf-7 CP:65000, 再上传到debian中编译,下断点,回归正常。

其实不能这么搞,原来SI的设置特意配置为Unix(LF)换行 + Chinese Simplified(GB18030) CP:54936, 就是为了大家编辑代码后,中文注释不会乱。问题解决后,看来和SI设置没关系。主要是代码行中带入了不可见字符引起的下断点串行。特别是,如果那个带入点是一个宏的话,串行就更厉害了。

可以考虑找到乱码行后,在vi中用x键将不可见字符删掉,然后wq保存,回传到win下svn归档。vi保存后的文件,除了去掉代码行中的不可见字符,不会对文件的编码格式做改动。用SI打开后,还是正常的.

  • 想看看带入的那2个字符是啥, 下断点串行时,尝试排查问题前,已经svn归档,英明啊。
    明天欣赏下那2个乱码字符的内容。然后再恢复成排查问题前的代码,重新修正一次。为了排查这个问题,想到那试到那,修改后的代码看起来好挫,好无理。

    <2018-5-14>
    diff下代码,还不能直接回到gdb下断点串行之前的版本,修正了一些小问题, 代码变化的地方挺零碎的。直接将代码搞挫的地方修正,提交,开始测试。
    在代码行中的那2个不可见字符的版本还没去看,问题的原因已经找到了,不可见字符是啥, 已经不关心了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值