GDB调试中的问题

问题描述:

我使用GDB调试C程序,但是我发现GDB执行一些代码两次。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

您是否启用了编译器优化? – 2011-04-29 08:20:01

+0

@Oli Charlesworth:是的,我认为它已启用。 – JavaMobile 2011-05-03 04:01:36

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

+0

来关闭它。如果是这样,我怎么知道或追踪程序的运行? – JavaMobile 2011-05-03 04:04:20

+0

如果它困扰你,你可以编译没有优化,因为Pih建议。如果你对实际的优化感兴趣,你总是可以反编译代码,并通过机器指令来代替源代码行('nexti','stepi')。 – mark4o 2011-05-03 04:49:14

尝试编译不使用任何优化(-O0),然后再次运行。 另一个想法,就是在s-> p_input上看一看,看看这个结构字段是否被修改过两次。

+0

工作?有什么问题? – Pih 2011-05-03 10:05:33

+0

我认为原因是编译器优化。所以我只是通过使用'g ++ -o0' – JavaMobile 2011-05-05 02:07:32