Большой исполняемый файл приводит к зависанию отладчиков
У меня есть бинарный файл C++ размером 190 МБ. Когда я помещаю этот двоичный файл в dbx и пытаюсь создать точку останова, dbx зависает. Пока dbx завис, я заметил, что его память быстро выросла до 10 ГБ. TotalView позволяет мне устанавливать точки останова; однако все отображаемые данные являются поддельными. Я успешно отладил многие другие меньшие двоичные файлы, поэтому я догадываюсь, что проблема заключается в большом размере этого двоичного файла.
Двоичный код: исполняемый 32-разрядный MSB ELF SPARC32PLUS Версия 1, V8+ Обязательный, динамически связанный, не очищенный.
Компилятор: CC: Sun C++ 5.9 SunOS_sparc 2007/05/03.
Dbx: 7,6 SunOS_sparc 2007/05/03.
TotalView: 8.2.0-0
Операционная система: Solaris 10
Как я использую Dbx:
dbx mybinary
stop at Something.cc:170
Dbx никогда не возвращается из этой команды, и я должен в конечном итоге убить Dbx из отдельного терминала.
Я попробовал несколько вещей без успеха:
1. Перешел на динамическое связывание в большинстве библиотек, что позволило уменьшить размер двоичного файла до 19 МБ.
2. Пробовал на солярисе х86.
3. Скомпилировал ПО как 64 битное.
Кто-нибудь знает, что может вызвать это и как решить проблему?
1 ответ
Попробуйте выполнить отладку с помощью другого отладчика, чтобы определить, является ли ваш код причиной проблемы. Мой любимый отладчик на Solaris - это mdb:
mdb ./yourapplicationname
> your_c_fn_name::bp
> ::run
Не забывайте использовать искаженные имена функций, если вы пишете код на C++. Вы передаете вывод nm в grep, чтобы узнать, как называется ваша искаженная функция:
nm ./yourapplicationname | grep yourc++fnname
Если у mdb такая же проблема с dbx, я бы посоветовал вам взглянуть на ваш код. Однако, если mdb попадает в bp без проблем, вы можете либо работать с mdb (который, насколько мне известно, не может работать с исходными файлами), либо вы можете продолжать настраивать свое приложение, чтобы сделать dbx счастливым.