为什么我在调试某些c程序的时候,GDB会跳过一些本来应该执行的语句?

Gin 2012-02-15 09:46:29
这是源码

void schedule(void)

{

int i = (last_task_nr == 0) ? last_task_nr = 1 : last_task_nr;//这里就没有执行



i++;

do

{

i = (i >= NR_TASKS) ? 1 : i;



if (task[i] == NULL) //这里也没有

continue;

if (TASK_RUNNING == task[i]->state)

{

last_task_nr = i;

break;

}



}while (++i != last_task_nr+1);



if (i == last_task_nr+1)

last_task_nr = 0;



switch_to(last_task_nr);

}



这是在gdb中调试的情景

schedule () at schedule.c:31
31 int i = (last_task_nr == 0) ? last_task_nr = 1 : last_task_nr;
(gdb)
33 i++;
(gdb)
46 }while (++i != last_task_nr+1);
(gdb)
36 i = (i >= NR_TASKS) ? 1 : i;
(gdb)
38 if (task[i] == NULL)
(gdb)
46 }while (++i != last_task_nr+1);
(gdb) p i 《== 这里也显示不了i的值
$1 = <value optimized out>
(gdb) n
36 i = (i >= NR_TASKS) ? 1 : i;
(gdb)
38 if (task[i] == NULL)
(gdb)
46 }while (++i != last_task_nr+1);
(gdb)

我在网上查,说可能是注释的问题,我把所有的注释都去掉,结果还是这样?究竟该怎么解决啊????
...全文
148 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序员小迷 2012-02-19
  • 打赏
  • 举报
回复
跳过语句只可能是:
1 代码被优化;
2 代码行数被修改,调试器没及时更新导致显示位置错误;
3 代码编译的目标文件过老,需要重新编译;
4 极小的概率是调试器出了问题
赵4老师 2012-02-16
  • 打赏
  • 举报
回复
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
a=fgetc(f);
//...
b=fgetc(f);//可能此时已经feof了!
//...
}
而这样写就没有问题:
whlie (1) {
a=fgetc(f);
if (feof(f)) break;
//...
b=fgetc(f);
if (feof(f)) break;
//...
}
类似的例子还可以举很多。

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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