GDB调试程序时,发现不按顺序执行,会乱跳,这是什么原因呢

赖阿甘 2018-01-29 09:56:58
网上说是因为优化编译导致的,取消优化编译即可!---------我想问都有哪些原因会导致调试程序时不按代码顺序执行?
...全文
2236 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赖阿甘 2018-02-04
  • 打赏
  • 举报
回复
引用 8 楼 zilaishuichina 的回复:
[quote=引用 7 楼 u010514711 的回复:]
显然, 不是。 首先,请明确, thread a, 不代表b线程就不执行了,你调试a线程,它b线程该怎么执行,还是怎么执行(如果b线程也在调用跟a线程同样的函数,那么b线程就也会进入该函数)。gdb里面next一下,和你在下一行代码处下一个断点,然后c(ontinue),是差不多的效果。所以这时你看到的就是执行的代码在乱跳,是因为不同的线程在调用同样的函数,你可以打印当前线程号。 然后你所希望的,就是a线程在执行的时候,其他线程都不执行了,那么你需要加 set scheduler-locking on ,这才是只调试当前线程, 其他线程都全停掉 [/quote]明白了,非常感谢兄台的不吝赐教,谢谢。
赖阿甘 2018-01-29
  • 打赏
  • 举报
回复
引用 6 楼 zilaishuichina 的回复:
[quote=引用 5 楼 u010514711 的回复:] [quote=引用 3 楼 zilaishuichina 的回复:] [quote=引用 2 楼 u010514711 的回复:] [quote=引用 1 楼 zilaishuichina 的回复:] 1、编译时加了优化选项 2、你调试的那段代码是在被多线程同时调用
我在一个线程内调试[/quote] 那就是优化导致的呗, 调式时不按代码顺序执行,基本上就那么2种情况,要么是1,要么是2,或者1、2都有[/quote]也就是说第二种情况调试时不主动切换线程是不会发现乱跳的情况的是吧[/quote] 什么叫主动切换线程。。。 多线程是在“同时”执行的,假设你有a,b两个线程,你在a线程中下个断点,进入断点的时候,a,b线程是都被暂停下来的了。 但是,注意,但是,当你next的时候,a,b线程是一起继续执行的。 直到a线程执行到下一行代码为止,此时a,b线程再次同时被暂停下来。 在a线程从一行代码执行到下一行代码这段时间内(这段时间可能很短,如果这行代码足够简单;也可能很长,比如你是调用了一个函数,而这个函数里面sleep了几秒钟,或者是做的一个很复杂的操作),a,b线程是同时在跑的!!! 所以如果a,b线程都调用了这段代码,那么在你next的这段很短的时间内,b线程也进入了这段代码是完全有可能的[/quote]主动切换线程是指在GDB调试时执行thread a这个命令,切换到线程a进行查看。你所说的第二种情况如果在一个线程内调试肯定是看不到执行代码乱跳的情况,除非你切换线程(就是调用thread a这个命令)。我这样理解对不。
zilaishuichina 2018-01-29
  • 打赏
  • 举报
回复
引用 5 楼 u010514711 的回复:
[quote=引用 3 楼 zilaishuichina 的回复:] [quote=引用 2 楼 u010514711 的回复:] [quote=引用 1 楼 zilaishuichina 的回复:] 1、编译时加了优化选项 2、你调试的那段代码是在被多线程同时调用
我在一个线程内调试[/quote] 那就是优化导致的呗, 调式时不按代码顺序执行,基本上就那么2种情况,要么是1,要么是2,或者1、2都有[/quote]也就是说第二种情况调试时不主动切换线程是不会发现乱跳的情况的是吧[/quote] 什么叫主动切换线程。。。 多线程是在“同时”执行的,假设你有a,b两个线程,你在a线程中下个断点,进入断点的时候,a,b线程是都被暂停下来的了。 但是,注意,但是,当你next的时候,a,b线程是一起继续执行的。 直到a线程执行到下一行代码为止,此时a,b线程再次同时被暂停下来。 在a线程从一行代码执行到下一行代码这段时间内(这段时间可能很短,如果这行代码足够简单;也可能很长,比如你是调用了一个函数,而这个函数里面sleep了几秒钟,或者是做的一个很复杂的操作),a,b线程是同时在跑的!!! 所以如果a,b线程都调用了这段代码,那么在你next的这段很短的时间内,b线程也进入了这段代码是完全有可能的
赖阿甘 2018-01-29
  • 打赏
  • 举报
回复
引用 3 楼 zilaishuichina 的回复:
[quote=引用 2 楼 u010514711 的回复:] [quote=引用 1 楼 zilaishuichina 的回复:] 1、编译时加了优化选项 2、你调试的那段代码是在被多线程同时调用
我在一个线程内调试[/quote] 那就是优化导致的呗, 调式时不按代码顺序执行,基本上就那么2种情况,要么是1,要么是2,或者1、2都有[/quote]也就是说第二种情况调试时不主动切换线程是不会发现乱跳的情况的是吧
赖阿甘 2018-01-29
  • 打赏
  • 举报
回复
引用 3 楼 zilaishuichina 的回复:
[quote=引用 2 楼 u010514711 的回复:] [quote=引用 1 楼 zilaishuichina 的回复:] 1、编译时加了优化选项 2、你调试的那段代码是在被多线程同时调用
我在一个线程内调试[/quote] 那就是优化导致的呗, 调式时不按代码顺序执行,基本上就那么2种情况,要么是1,要么是2,或者1、2都有[/quote]您所说的第二种情况,只有调试程序时主动切换线程才会遇到吧,如果不切换线程调试不会遇到这种情况吧
zilaishuichina 2018-01-29
  • 打赏
  • 举报
回复
引用 2 楼 u010514711 的回复:
[quote=引用 1 楼 zilaishuichina 的回复:] 1、编译时加了优化选项 2、你调试的那段代码是在被多线程同时调用
我在一个线程内调试[/quote] 那就是优化导致的呗, 调式时不按代码顺序执行,基本上就那么2种情况,要么是1,要么是2,或者1、2都有
赖阿甘 2018-01-29
  • 打赏
  • 举报
回复
引用 1 楼 zilaishuichina 的回复:
1、编译时加了优化选项 2、你调试的那段代码是在被多线程同时调用
我在一个线程内调试
zilaishuichina 2018-01-29
  • 打赏
  • 举报
回复
1、编译时加了优化选项 2、你调试的那段代码是在被多线程同时调用
AlbertS 2018-01-29
  • 打赏
  • 举报
回复
多数情况的是优化造成的,编译时加上O0选项
zilaishuichina 2018-01-29
  • 打赏
  • 举报
回复
引用 7 楼 u010514711 的回复:
显然, 不是。 首先,请明确, thread a, 不代表b线程就不执行了,你调试a线程,它b线程该怎么执行,还是怎么执行(如果b线程也在调用跟a线程同样的函数,那么b线程就也会进入该函数)。gdb里面next一下,和你在下一行代码处下一个断点,然后c(ontinue),是差不多的效果。所以这时你看到的就是执行的代码在乱跳,是因为不同的线程在调用同样的函数,你可以打印当前线程号。 然后你所希望的,就是a线程在执行的时候,其他线程都不执行了,那么你需要加 set scheduler-locking on ,这才是只调试当前线程, 其他线程都全停掉

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧