Как опция отладки -g изменяет двоичный исполняемый файл?

Вы можете попробовать что-то вроде этого

list.Sort((x, y) =>
{
    if (x.Id == 0)
    {
        return -1;
    }
    if (y.Id == 0)
    {
        return 1;
    }

    return x.Group.Name.CompareTo(y.Group.Name);
});

Где список List<T>.

Этот метод использует опцию пользовательской сортировки, предоставленную List<T>, используя Comparison<T> делегат.

В основном, что делает этот метод, он просто добавляет особое условие для сравнения, когда Id. Если он равен нулю, он вернет значение, указывающее, что объект меньше, что заставляет объект входить в верхнюю часть списка. Если нет, он сортирует объект, используя его свойство Group.Name в порядке возрастания.

67
задан Jon Ball 18 September 2008 в 02:55
поделиться

7 ответов

-g говорит компилятору хранить информацию таблицы символов в исполняемом файле. Среди прочего это включает:

  • имена символа
  • информация о типе для символов
  • файлы и номера строки, куда символы прибыли от

, Отладчики используют эту информацию, чтобы произвести понятные имена для символов и связать инструкции с конкретными строками в источнике.

Для некоторых компиляторов, предоставляя-g отключит определенную оптимизацию. Например, ICC устанавливает уровень оптимизации по умолчанию на-O0 с-g, если Вы явно не указываете на-O[123]. Кроме того, даже при предоставлении-O[123] будет все еще отключена оптимизация, которая предотвращает трассировку стека (например, разделяющий указатели кадра от стековых фреймов. Это имеет только незначительный эффект на производительность).

С некоторыми компиляторами,-g отключит оптимизацию, которая может перепутать, куда символы прибыли из (переупорядочение инструкции, развертывание цикла, встроив и т.д.). Если Вы хотите отладить с оптимизацией, можно использовать-g3 с gcc для обхождения части этого. Дополнительная информация об отладке будет включена о макросах, расширениях и функциях, которые, возможно, были встроены. Это может позволить отладчикам и инструментам производительности отображать оптимизированный код на первоисточник, но это - максимальные усилия. Некоторая оптимизация действительно искажает код.

Для большего количества информации, смотрите на КАРЛИК , формат отладки, первоначально разработанный для соглашений с ELF (двоичный формат для Linux и другая ОС).

64
ответ дан 11 revs 18 September 2008 в 13:55
поделиться

Таблица символов добавляется к исполняемому файлу, который отображает функцию/имена переменной на местоположения данных, так, чтобы отладчики могли сообщить значимая информация, а не просто указатели. Это не производит скорость Вашей программы, и можно удалить таблицу символов с командой 'полосы'.

9
ответ дан Alexandra Franks 18 September 2008 в 13:55
поделиться

В дополнение к отладке и информации о символе
Google DWARF (Шутка Разработчика над ELF)

По умолчанию выключена большая часть оптимизации компилятора, когда отладка включена.
, Таким образом, код является чистым переводом источника в Машинный код, а не результат многих узкоспециализированных преобразований, которые применяются для выпуска двоичных файлов.

, Но наиболее важное различие (по-моему)
Память в сборках Отладки обычно инициализируется к некоторому компилятору определенные значения для упрощения отладки. В сборках конечных версий память не инициализируется, если явно не сделано так кодом приложения.

Проверка Ваша документация компилятора для получения дополнительной информации:
, Но пример для DevStudio:

  • 0xCDCDCDCD, Выделенный в "куче", но не инициализированный
  • , 0xDDDDDDDD Освободил память "кучи".
  • заборы 0xFDFDFDFD "NoMansLand", автоматически помещенные в границу памяти "кучи". Никогда не должен перезаписываться. Если Вы действительно перезаписываете один, Вы, вероятно, уходите от конца массива.
  • 0xCCCCCCCC, Выделенный на стеке, но не инициализированный
8
ответ дан Martin York 18 September 2008 в 13:55
поделиться

-g добавляет отладочную информацию в исполняемом файле, таком как названия переменных, названия функций и номера строки. Это позволяет отладчику, такому как gdb ступать через строку кода с методической точностью, устанавливать точки останова и осматривать значения переменных. Из-за этой дополнительной информации с помощью-g увеличивает размер исполняемого файла.

кроме того, gcc позволяет использовать-g вместе с флагами-O, которые включают оптимизацию. Отладка оптимизированного исполняемого файла может быть очень хитрой, потому что переменные могут быть оптимизированы далеко, или инструкции могут быть выполнены в другом порядке. Обычно это - хорошая идея выключить оптимизацию при использовании-g, даже при том, что это приводит к намного более медленному коду.

7
ответ дан Dima 18 September 2008 в 13:55
поделиться

Так же, как вопрос, представляющий интерес можно взломать hexeditor и смотреть на исполняемый файл, произведенный с -g и один без. Вы видите символы и вещи, которые добавляются. Это может изменить блок (-S) также, но я не уверен.

3
ответ дан Bernard 18 September 2008 в 13:55
поделиться

Некоторые операционные системы (как z/OS) производят "файл стороны", который содержит отладочные символы. Это помогает постараться не чрезмерно увеличивать размер исполняемого файла с дополнительной информацией.

3
ответ дан Anthony Giorgio 18 September 2008 в 13:55
поделиться

Существует некоторое перекрытие с этим вопрос , который охватывает проблему с другой стороны.

3
ответ дан Community 18 September 2008 в 13:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: