Определение того, какие объектные файлы вызвали увеличение размера .dll [C ++] - PullRequest
6 голосов
/ 02 июня 2009

Я работаю над большой библиотекой на C ++, которая за последнее время значительно выросла. Из-за его размера не очевидно, что вызвало это увеличение размера.

Есть ли у вас какие-либо предложения инструментов (msvc или gcc), которые могли бы помочь определить, откуда произошел рост.

редактировать Вещи, которые я пробовал: Dumpbin финальный dll, файлы obj, создание файла карты и копирование его.

изменить еще раз Так что objdump вместе со скриптом на python, похоже, сделали то, что я хочу.

Ответы [ 4 ]

7 голосов
/ 02 июня 2009

Если gcc, objdump . Если визуальная студия, мусорная корзина .

Я бы предложил сделать различие вывода инструмента для старой (маленькой) библиотеки по сравнению с новой (большой) библиотекой.

1 голос
/ 02 июня 2009

В Linux должно быть довольно легко увидеть, были ли новые файлы добавлены с помощью рекурсивного сравнения. Они наверняка приведут к увеличению размера библиотеки. Затем вы можете использовать инструмент командной строки size в Linux, чтобы получить размеры каждого из новых объектных файлов и суммировать их. Затем сравните эту сумму с увеличением вашей библиотеки и проверьте, насколько она отличается.

0 голосов
/ 02 июня 2009
Ответ

keysersoze (сравните вывод objdump или dumpbin) является правильным. Другой подход состоит в том, чтобы указать компоновщику создать файл карты и сравнить файлы карт для старой и новой версий DLL.

  • MSVC: link.exe /MAP
  • GCC и binutils: ld -M (или gcc -Wl,-M)
0 голосов
/ 02 июня 2009

G'day,

Если у вас есть какие-либо предыдущие версии объектного файла, можете ли вы выполнить команду размера, чтобы увидеть, какой сегмент вырос?

Пара вопросов:

  • Вы используете * nix-платформу или платформу Windows?
  • Какой компилятор вы используете?
  • Был ли недавно изменен компилятор?
  • Был ли недавно добавлен флаг -g? (очевидный вопрос 1)
  • Был ли объект ранее раздет? (очевидный вопрос 2)
  • Был ли объект динамически связан ранее? (очевидный вопрос 3)

Редактировать: Если код находится в SCM, вы можете проверить версию источника, которая дала вам меньший объект. Тогда сравните:

  1. размер исходных деревьев, выполняя du -sk для старого исходного дерева, а затем нового исходного дерева, не создавая ничего.
  2. количество файлов, делая что-то вроде find ./tree_top ( -name *.h -o -name *.cpp ) | wc -l
  3. расположение увеличенного числа файлов, сделав find ./tree_top ( -name *.h -o -name *.cpp ) -print | sort > treelist, а затем сделайте то же самое для нового большего дерева. Выполнение простого sdiff покажет любое большое количество новых файлов.
  4. размер базы кода, даже простое число конечных точек с запятой даст вам хороший базовый механизм для сравнения между ними.
  5. Makefiles или build env. для проекта, чтобы увидеть, не попали ли другие опции или настройки в саму сборку.

НТН

BTW Пожалуйста, опубликуйте свои выводы здесь, так как я уверен, что многие люди заинтересованы в том, что вы узнаете.

ура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...