Linux удаление отладочной информации

Удаление всей отладочной информации, кроме указанной, из исполняемого файла

Я разрабатываю общую библиотеку для Linux, которая порождает несколько потоков, которые я хочу пометить в отладчике.

Я читал, что это можно сделать, написав в /proc/[PID]/tasks/[TID]/comm, но это не работает (я ориентируюсь на более старую libc). Я также хочу иметь возможность назначать имена длиннее, чем лимит связи.

Мой план состоял в том, чтобы автоматически загрузить скрипт Python, поместив его в . раздел debug_gdb_scripts.

Однако я хочу удалить отладочную информацию, кроме скрипта и того, что ему нужно. Я пытался использовать параметр —keep-symbol, но все разделы отладки (включая .debug_gdb_scripts) по-прежнему удалены.

Есть ли способ сохранить их?

1 ответ

Одна идея, которая приходит на ум, состоит в том, чтобы сначала удалить вашу программу, а затем добавить .debug_gdb_scripts , используя objcopy .

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

Я хочу распространять общую библиотеку, в которой пользователи могут устанавливать точки останова и печатать информацию об аргументах для нескольких функций, но удалять информацию о символах/отладке для всего остального. Звучит так, как будто это невозможно.

Я думаю, что это определенно сложно, потому что вы хотели бы отправить DWARF для типов и некоторой информации для этих функций, но не для других.

Источник

Как удалить логи journalctl

journalctl является частью systemd. Предназначение в замене syslog и организации удобного доступа к отладочной информации.

Читайте также:  Find usb linux device

journalctl можно гибко настраивать, в частности ограничивать объем создаваемых логов.
По умолчанию лимита нет и на сервере с небольшим диском можно заметить, что из 5-10 Гб содержимое /var/log/journal занимает 1-2 Гб и больше.

Хранить эти логи обычно нет необходимости.

Просмотреть занимаемый объем можно так:

3G /var/log/journal/91c885f9c744464f98b16fb5cb733f5c
3G /var/log/journal

Ограничения можно установить двумя способами:

1. по времени хранения логов (например, за последние 7 дней)

2. по занимаемому объему на диске (например, не более 100 Мб)

Пример приведен на скриншоте:

как удалить логи journalctl

Здесь можно видеть, что освобождено 240 Мб. Такой способ удаления логов очень удобен когда на диске полностью закончилось место и нужно оперативно освободить какое-то пространство чтобы восстановить работу сервисов.

Вручную удалять содержимое /var/log/journal не следует. Приведенные команды сразу зачищают лишние данные, также контролируется соответствие заданным условиям в дальнейшем.

В конфигурационные файлы дополнительные директивы не добавляются.

Читайте отдельный материал про journald — систему журналирования системы инициализации systemd.

В материале приведены основные команды для работы с системой. Такие как просмотр логов по сервису за последний час или последние сутки.

Источник

Удалить отладочную информацию из общей библиотеки Linux

Я использую GCC для компиляции общей библиотеки для ARM Linux. Вот мои параметры компилятора из CMakeLists.txt:

add_definitions( "-std=c++14 -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wno-psabi -march=native -mfpu=neon" ) 

Я только что открыл получившийся файл .so в дизассемблере. Я был разочарован, увидев там много вещей. Он показал мне имена для всего, включая все мои внутренние классы и функции, которые никогда не экспортировались. Даже материал из анонимных пространств имен все еще там. На вкладке «Экспорт» в дизассемблере я вижу только дюжину функций, которые я действительно экспортирую (плюс еще несколько дополнительных: .init_proc .term_proc _edata __bss_end__ и call_weak_fn ).

Читайте также:  Windows access linux network

В Windows я вижу эти вещи только в том случае, если у меня есть файл PDB для модуля, который я разбираю. Но я не отправляю свои файлы .PDB.

Я бы хотел такого же поведения для GCC.

Есть ли способ заставить GCC прекратить включать эту отладочную информацию (= искаженное имя каждой функции) в файл .so и фактически скомпилировать эти вещи в двоичные адреса?

Другой способ уменьшить размер раздела ELF — -Wl,-exclude-libs,All (см. ld(1) ). параметры компоновщика). Он не позволяет вашему общему объекту реэкспортировать данные из его зависимостей.

«Он показал мне имена для всего, включая все мои внутренние классы и функции, которые никогда не экспортировались. « – могут помочь две вещи. Сначала скомпилируйте с помощью -ffunction-sections -fdata-sections и свяжите с -Wl,—gc-sections . Во-вторых, вы можете удалить символы после связывания. Для этого используйте что-то вроде arm-linux-androideabi-strip —strip-all foo .

«Есть ли способ сказать GCC, чтобы он прекратил включать эту отладочную информацию. « — Они уже скомпилированы в двоичный файл. То, что вы видите, — это запись отладки, которая помогает при отладке и диагностике. Обычно вы либо (1) опускаете символы отладки; или (2) вы раздеваетесь после сборки. Это путь Unix и Linux. Также см. strip(1) справочную страницу.

Добавил эти параметры компилятора + компоновщика в CMakeLists.txt (используя add_definitions и target_link_libraries), которые ничего не изменили.

Да, только что обнаружил /usr/bin/strip, он сделал то, что я хотел, и уменьшил размер до 55% от оригинала. В идеале я бы хотел, чтобы cmake делал это, однако я могу использовать отдельный шаг после сборки (я все равно использую сценарий оболочки для вызова cmake).

Читайте также:  Вес файлов в директории linux

1 ответ

Вам нужно добавить -Wl,—strip-debug к вашим флагам компоновщика.

Источник

Про отладочные символы

Большинство программ и библиотек по умолчанию компилируются с символами отладки (с опцией -g для gcc).

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

Но исключение отладочных символов существенно уменьшает размер программы или библиотеки. Чтобы получить представление о том, сколько места занимает отладочная информация, посмотрите следующее:

  • бинарник bash с отладочными символами: 1200 KB
  • бинарник bash без отладочных символов: 480 KB
  • файлы Glibc и GCC (/lib и /usr/lib) с отладочными символами: 87 MB
  • файлы Glibc и GCC без отладочных символов: 16 MB

Размер может немного варьироваться в зависимости от используемых компилятора и библиотеки C. Но размер между программами и библиотеками, собранными с отладочной информацией и без таковой может различаться в 2-5 раз.

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

Для удаления отладочных символов из бинарников (которые должны быть бинарниками форматов a.out или ELF), запустите strip —strip-debug filename . Могут использоваться шаблоны для выбора нескольких файлов (например, strip —strip-debug $LFS/tools/bin/* ).

Для вашего удобства, Глава 9 включает одну простую команду для удаления всех отладочных символов изо всех программ и библиотек в вашей системе. Дополнительную информацию по оптимизации можно получить на http://www.linuxfromscratch.org/hints/downloads/files/optimization.txt.

linux samba mail postfix FreeBSD Unix doc linux howto ALTLinux PHP faq bind sendmail apache iptables firewall kernel rpm apt-get Slackware openssh Cisco debian vmware GNU oracle sun awk /etc/ passwd linux установка учебник книга скачать

Источник

Оцените статью
Adblock
detector