GDB调试中的问题

时间:2011-04-29 08:16:09

标签: c linux debugging gdb

我使用GDB调试C程序,但我发现GDB执行了两次代码。

例如,

 ....
    stream_t *s = stream_CommonNew( VLC_OBJECT(p_access) );
    stream_sys_t *p_sys;
    if( !s )
    return NULL;
    s->p_input = p_access->p_input;
    s->psz_path = strdup( p_access->psz_path );
  ....

GDB调试,

292     stream_t *s = stream_CommonNew( VLC_OBJECT(p_access) );
Missing separate debuginfos, use: debuginfo-install dbus-libs-1.2.16-9.fc12.i686 libcap-ng-0.6.2-3.fc12.i686
(gdb) next
295     if( !s )
(gdb) 
292     stream_t *s = stream_CommonNew( VLC_OBJECT(p_access) );
(gdb) 
295     if( !s )
(gdb) 
298     s->p_input = p_access->p_input;
(gdb) 
299     s->psz_path = strdup( p_access->psz_path );
(gdb) 
298     s->p_input = p_access->p_input;
(gdb) 
299     s->psz_path = strdup( p_access->psz_path );

我很困惑。你能解释一下原因吗?

由于

2 个答案:

答案 0 :(得分:4)

实际上并没有两次执行相同的代码。编译器优化可以导致机器指令被重新排序,使得为第二源线生成的一些指令被放置在第一源线的最后一条指令之前。当与指令对应的源行发生变化时,Gdb的“next”命令停止,即使它实际上只是执行尚未完成的源行的其余部分。

答案 1 :(得分:1)

尝试编译而不进行任何优化( -O0 )并再次运行。 另一个想法是,将手表放在s-> p_input上,看看这个结构字段是否被修改了两次。