2011-04-29 141 views
4

我使用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

回答

4

它實際上並沒有執行兩次相同的代碼。編譯器優化可以導致機器指令被重新排序,以便爲第二個源代碼行生成的一些指令放置在第一個源代碼行的最後一個指令之前。 GDB的「下一個」命令在與該指令對應的源代碼行發生更改時停止,即使它實際上可能只是執行尚未完成的源代碼行的其餘部分。

+0

來關閉它。如果是這樣,我怎麼知道或追蹤程序的運行? – JavaMobile 2011-05-03 04:04:20

+0

如果它困擾你,你可以編譯沒有優化,因爲Pih建議。如果你對實際的優化感興趣,你總是可以反編譯代碼,並通過機器指令來代替源代碼行('nexti','stepi')。 – mark4o 2011-05-03 04:49:14

1

嘗試編譯不使用任何優化(-O0),然後再次運行。 另一個想法,就是在s-> p_input上看一看,看看這個結構字段是否被修改過兩次。

+0

工作?有什麼問題? – Pih 2011-05-03 10:05:33

+0

我認爲原因是編譯器優化。所以我只是通過使用'g ++ -o0' – JavaMobile 2011-05-05 02:07:32