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

#c #linux #debugging #gdb

#c #linux #отладка #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 );
  

Я в замешательстве. Не могли бы вы объяснить, почему?

Спасибо

Комментарии:

1. Включена ли у вас оптимизация компилятора?

2. @Oli Charlesworth: да, я думаю, что это включено.

Ответ №1:

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

Комментарии:

1. Я понимаю. Если это так, то как я могу узнать или отследить выполнение программы?

2. Если это вас беспокоит, вы можете скомпилировать без оптимизации, как предложил Pih. Если вас интересуют реальные оптимизации, вы всегда можете разобрать код и выполнить пошаговые машинные инструкции вместо исходной строки ( nexti , stepi ).

Ответ №2:

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

Комментарии:

1. Сработало? В чем была проблема?

2. Я думаю, причина в оптимизации компилятора. Поэтому я просто отключаю это с помощью ‘g -o0’