Оптимизирован код на Unix? - PullRequest
       29

Оптимизирован код на Unix?

2 голосов
/ 12 октября 2009

Какой самый лучший и простой способ отладки оптимизированного кода в Unix, написанного на C?

Иногда у нас также нет кода для создания неоптимизированной библиотеки.

Ответы [ 3 ]

3 голосов
/ 12 октября 2009

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

Одно странное поведение: даже если у вас есть исходный код, он будет перескакивать туда и обратно в тех местах, где вы не ожидаете (операторы могут быть переупорядочены для повышения производительности), или переменные больше не существуют (оптимизированы вне !) установка точек останова во встроенных функциях не имеет смысла (они не там, а являются частью места, где они встроены). Так что даже с исходным кодом, остерегайтесь этих ловушек.

Я забыл упомянуть, файлы символов обычно имеют расширение .gdb, но оно может быть другим ...

2 голосов
/ 13 октября 2009

Этот вопрос мало чем отличается от того, «как лучше починить легковой автомобиль?»

Лучший способ отладки оптимизированного кода в UNIX зависит от того, какой именно UNIX у вас есть, какие инструменты у вас есть и какие проблемы вы пытаетесь отлаживать.

Отладка сбоя в malloc сильно отличается от отладки unresolved symbol at runtime.

Для общих методов отладки я рекомендую эту книгу .

Несколько вещей облегчат отладку на «уровне сборки»:

  • Ты должен знать призвание конвенция для вашей платформы, так что вы могу сказать, какие значения передаются в и вернулся, где найти this указатель, регистры которого «сохранены для вызывающего абонента», а «сохранены для вызываемого абонента» и т. Д.
  • Вы должны знать «соглашение о вызовах» вашей ОС - как выглядит системный вызов, в который записывается номер системного вызова, первый параметр и т. Д.
  • Вы должны «мастер» отладчик: умение найти темы, как остановить человека темы, как установить условный точка останова на индивидуальной инструкции, пошаговая, пошаговая или пропускаемая вызовы функций, и т.д.

Часто помогает отлаживать работающую программу и сломанную программу "параллельно". Если версия 1.1 работает, а версия 1.2 - нет, где они расходятся по отношению к конкретному API? Запустите обе программы под отладчиком, установите точки останова для одного и того же набора функций, запустите обе программы и наблюдайте различия в том, какие точки останова достигнуты и какие параметры переданы.

0 голосов
/ 12 октября 2009

Пишите небольшие примеры кода с помощью одних и тех же интерфейсов (что-то в заголовке) и вызывайте свои примеры вместо этого оптимизированного кода, скажем, симуляции, чтобы сузить область кода, которую вы отлаживаете. Кроме того, вы можете делать ошибки в своих примерах.

...