Проблема в отладке GDB - PullRequest
       2

Проблема в отладке GDB

4 голосов
/ 29 апреля 2011

Я использую 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 ]

4 голосов
/ 29 апреля 2011

На самом деле один и тот же код не выполняется дважды.Оптимизация компилятора может привести к переупорядочению машинных инструкций, так что некоторые инструкции, сгенерированные для второй строки источника, помещаются перед последней инструкцией для первой строки источника.Команда «next» GDB останавливается, когда изменяется исходная строка, соответствующая инструкции, даже если она фактически выполняет только остальную часть исходной строки, которая еще не была завершена.

1 голос
/ 29 апреля 2011

Попробуйте скомпилировать без какой-либо оптимизации ( -O0 ) и запустить снова.Другая идея, это поставить часы на s-> p_input и посмотреть, будет ли это поле структуры изменено дважды.

...