免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3060 | 回复: 11

[C++] [结贴]STL的类函数调用,作为断点会让调试器崩溃? [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2016-10-21 11:33 |显示全部楼层
本帖最后由 asker160 于 2016-10-25 11:17 编辑

我想让我下面的代码,当s="abc"的时候, 断到"f()"函数里面,让我能查看"i"的值。
  1.     #include<string>
  2.     using namespace std;
  3.     int i=0;
  4.     void f(const string& s1)
  5.     {
  6.         ++i; // line 6
  7.     }
  8.     int main()
  9.     {
  10.         string s="a";
  11.         s+="b";
  12.         s+="c";
  13.         s+="d";
  14.         s+="e";
  15.         s+="f";
  16.         return 0;
  17.     }
复制代码
编译运行,没有问题。但是调试呢?
  1. g++ 1.cpp -g
  2.     gdb a.out
  3.     ...
  4.     (gdb) b main:6 if strcmp(s.c_str(),"abc")==0
  5.     Breakpoint 1 at 0x400979: file 1.cpp, line 9.
复制代码
然后我运行它,看起来是我的程序或者gdb自己崩溃了:
  1.     (gdb) r
  2.     Starting program: /home/dev/a.out

  3.     Program received signal SIGSEGV, Segmentation fault.
  4.     __strcmp_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcmp-sse2-unaligned.S:31
  5.     31    ../sysdeps/x86_64/multiarch/strcmp-sse2-unaligned.S: No such file or directory.
  6.     Error in testing breakpoint condition:
  7.     The program being debugged was signaled while in a function called from GDB.
  8.     GDB remains in the frame where the signal was received.
  9.     To change this behavior use "set unwindonsignal on".
  10.     Evaluation of the expression containing the function
  11.     (__strcmp_sse2_unaligned) will be abandoned.
  12.     When the function is done executing, GDB will silently stop.

  13.     Program received signal SIGSEGV, Segmentation fault.

  14.     Breakpoint 1, __strcmp_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcmp-sse2-unaligned.S:31
  15.     31    in ../sysdeps/x86_64/multiarch/strcmp-sse2-unaligned.S
复制代码
如果我把这个断点的信息修改一下:
  1.     (gdb) b main:6 if s.compare("abc")==0
  2.     Breakpoint 1 at 0x400979: file 1.cpp, line 9.
复制代码
这次输出信息不一样,但是还是貌似崩溃。
  1.     (gdb) r
  2.     Starting program: /home/dev/a.out

  3.     Program received signal SIGSEGV, Segmentation fault.
  4.     __memcmp_sse4_1 () at ../sysdeps/x86_64/multiarch/memcmp-sse4.S:1024
  5.     1024    ../sysdeps/x86_64/multiarch/memcmp-sse4.S: No such file or directory.
  6.     Error in testing breakpoint condition:
  7.     The program being debugged was signaled while in a function called from GDB.
  8.     GDB remains in the frame where the signal was received.
  9.     To change this behavior use "set unwindonsignal on".
  10.     Evaluation of the expression containing the function
  11.     (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::compare(char const*) const) will be abandoned.
  12.     When the function is done executing, GDB will silently stop.

  13.     Program received signal SIGSEGV, Segmentation fault.

  14.     Breakpoint 1, __memcmp_sse4_1 () at ../sysdeps/x86_64/multiarch/memcmp-sse4.S:1024
  15.     1024    in ../sysdeps/x86_64/multiarch/memcmp-sse4.S
复制代码
到底是gdb还是我的程序收到了段错误的信号? 原因是什么?

论坛徽章:
169
申猴
日期:2013-10-09 10:10:16天秤座
日期:2013-10-10 15:28:08天蝎座
日期:2014-07-17 14:02:54丑牛
日期:2014-07-17 14:03:04处女座
日期:2014-07-17 14:03:12双子座
日期:2014-07-17 14:03:21天秤座
日期:2014-07-17 14:03:29酉鸡
日期:2014-07-17 14:03:39金牛座
日期:2014-07-21 10:37:54水瓶座
日期:2014-07-22 16:56:09巳蛇
日期:2014-07-23 11:48:03天蝎座
日期:2014-07-31 10:16:36
发表于 2016-10-21 13:53 |显示全部楼层
虽然不知道 但是还是给楼主顶个楼咯

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
发表于 2016-10-21 14:04 |显示全部楼层
说好的 stl 函数呢?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2016-10-21 14:15 |显示全部楼层
回复 1# asker160

到底是gdb还是我的程序收到了段错误的信号?


你的程序。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2016-10-21 14:41 |显示全部楼层
本帖最后由 MMMIX 于 2016-10-21 14:46 编辑

回复 1# asker160

(gdb) b main:6 if strcmp(s.c_str(),"abc")==0
    Breakpoint 1 at 0x400979: file 1.cpp, line 9.

这个b main的输出很奇怪: 我明明是想断在第6行,它却硬说是 "line9"断了。

你想断在第六行,可惜告诉gdb的时候没说对。断在第六行你直接用 b 6 就可以了,用 b main:6 意思就完全变了。

BTW,那个 SIGSEGV 的原因其实很清楚,断点在 main() 的开头,这时候 string s 还没构造出来呢,直接调用它的成员函数和另外的 C-style 比较,出错也是正常的。

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
发表于 2016-10-21 14:57 |显示全部楼层
而且,string 也不算 stl,string 是标准库的一部分不假,不过不是 stl。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2016-10-21 16:22 |显示全部楼层
VIP_fuck 发表于 2016-10-21 14:57
而且,string 也不算 stl,string 是标准库的一部分不假,不过不是 stl。

string不是STL? 那我们常用的std里面的容器还有哪些不是STL呢,有没有语言标注拿来说明哪些东西算到STL头上呢?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2016-10-21 16:47 |显示全部楼层

按照你的说法,我修改了一下程序和调试的过程,但还是有问题:
  1. #include<string>
  2. using namespace std;
  3. int i=0;
  4. void f()
  5. {
  6.     ++i;//我希望s的内容是"abc"的时候, break到f里面,让我可以打印i
  7. }
  8. int main()
  9. {
  10.     string s="a";
  11.     f();
  12.     s+="b";
  13.     f();
  14.     s+="c";
  15.     f();
  16.     s+="d";
  17.     f();
  18.     return 0;
  19. }
复制代码
编译(g++ -g)并调试这个程序
  1. (gdb) b main
  2. Breakpoint 1 at 0x400975: file 1.cpp, line 9.
  3. (gdb) r
  4. Starting program: /home/a/cpp/a.out

  5. Breakpoint 1, main () at 1.cpp:9
  6. 9        {
  7. (gdb) n
  8. 10          string s="a";
  9. (gdb) n
  10. 11          f();
  11. (gdb) b 6 if strcmp(s.c_str(),"abc")==0
  12. No symbol "s" in current context.
  13. (gdb) p s
  14. $1 = "a"
复制代码
上面的信息很奇怪: "p s"都可以打印出当前s的内容,但是我想设置的断点信息
  1. (gdb) b 6 if strcmp(s.c_str(),"abc")==0
  2. No symbol "s" in current context.
复制代码
gdb说找不到s这个符号。这我就不理解了。都能打印符号,为什么还说找不到呢?
大侠解释一下!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2016-10-21 19:42 |显示全部楼层
回复 8# asker160

   ++i;//我希望s的内容是"abc"的时候, break到f里面,让我可以打印i

这个想法对 C 来说是不现实的,无法实现。

(gdb) b 6 if strcmp(s.c_str(),"abc")==0
No symbol "s" in current context.

b 6 if strcmp(s.s_str(), "abc") == 0 的意思是:在 line 6 打个断点,当程序的执行到了这个断点的时候,执行 if 后的条件判断语句,成功就停下,不成功就继续执行。但是 line 6 是在函数 f() 中,而 s 是函数 main() 里面的一个局部变量,C 的 scope rule 是 static,而不是 dynamic,因此在 f() 里面根本没办法访问到 main() 里面的局部变量 s。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2016-10-24 17:05 |显示全部楼层

谢谢,这个解释很好。
我把string s改成了全局变量,但还是不行啊。按说既然是全局变量了,在f的内部也应该能访问,对吧?
  1. (gdb) l
  2. 1        #include<string>
  3. 2        using namespace std;
  4. 3        int i=0;
  5. 4        string s="a";
  6. 5        void f()
  7. 6        {
  8. 7          ++i;
  9. 8        }
  10. 9        int main()
  11. 10        {
  12. (gdb) l
  13. 11          f();
  14. 12          s+="b";
  15. 13          f();
  16. 14          s+="c";
  17. 15          f();
  18. 16          s+="d";
  19. 17          f();
  20. 18          s+="e";
  21. 19          f();
  22. 20          s+="f";
  23. (gdb) b main
  24. Breakpoint 1 at 0x4009c0: file 1.cpp, line 11.
  25. (gdb) r
  26. Starting program: /home/a/cpp/a.out

  27. Breakpoint 1, main () at 1.cpp:11
  28. 11          f();
  29. (gdb) n
  30. 12          s+="b";
  31. (gdb) b 6 if strcmp(s.c_str(),"abc")==0
  32. No symbol "s" in current context.
复制代码
还是说没有找到。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP