LINUX.ORG.RU

Приложение падает до входа в main

 ,


2

2

Пытаюсь отладить приложение, которое падает до входа в main.

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

Есть подозрение, что все это дело падает на инициализации какой-то static переменной класса, т.к. подобную ошибку когда-то в этих библиотеках уже находили.

В общем жду советов, как все это безобразие можно отладить или хотя бы детектировать ошибку. Желательно, чтобы способ ограничивался использованием gdb и утилит из стандартного набора GNU.

Update: Библиотеку в которой происходит падение вычислили. Теперь необходимо понять, где именно в этой библиотеке происходит падение.
Все (приложение и библиотеки) собрано с отладочной информацией.

★★★★★

Последнее исправление: trex6 (всего исправлений: 2)

Ответ на: комментарий от queen3

все это безобразие под арм запускается, а туда я валгринд поставить не осилил. на 86 баг не воспроизводится и в валгринде не отсвечивает

anonymous
()
Ответ на: комментарий от vahtu

До входа в main программа не выполняется.

У-тю-тюшечки! Да это, батенька, обыкновенный фашизм. Типа, расово чистые функции выполняются только после main, а все остальные - грязь?

anonymous
()
Ответ на: комментарий от anonymous

Ну вот например:

Program received signal SIGSEGV, Segmentation fault.
0x2bf30234 in ?? ()
(gdb) bt
#0  0x2bf30234 in ?? ()
#1  0x0000003c in ?? ()
#2  0x0000003c in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

trex6 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Не получается у меня валгринд для тегры собрать. Заодно думал нормально gdb освоить. Уже в gdb более-менее освоился, но как решить проблему не могу понять.

В gdb.pdf нашел абзац про catch load, но он у меня работать не хочет (может быть версия старая, так же встречал упоминания, что это работает только для HPUX).

Пробовал ставить stop-on-solib-events, но он видимо только для dlopen работает, а для слинкованных либ нет.

Пробовал break на сисколы ставить, но опять же не нашел, какой из них отвечает за загрузку библиотек. Только для dlopen нашел.

trex6 ★★★★★
() автор топика
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от vahtu

До входа в main программа не выполняется

Я как раз на собеседованиях задаю вопрос: «Можно ли вывести в консоль „hello world\n“ до старта main()?». Следующий наводящий вопрос: «Что такое std::cout,std::cerr и тд и как они работают?»

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

Интересный вопрос. Вчерашний студен в основной своей массе вряд ли знает верный ответ.

А как с моей проблемой?

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

Попробуй прогнать через strace и посмотреть после загрузки какой библиотеки валится. Потом, если имеются в наличии исходники этой библиотеки, посмотреть на ее глобальные символы и секцию инициализации. Для глобальных символов расставить break на конструкторы.

anonymous
()
Ответ на: комментарий от trex6

А как с моей проблемой?

Я выше писал совет. Я бы попробовал ltrace. Ниже предложили strace, но ltrace тут более к месту.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от trex6

Не получается у меня валгринд для тегры собрать.

Возьми готовую сборку (из debian, например).

Заодно думал нормально gdb освоить. Уже в gdb более-менее освоился, но как решить проблему не могу понять.

Расставить breakpoint-ы во всех статических конструкторах, естественно.

Пробовал break на сисколы ставить, но опять же не нашел, какой из них отвечает за загрузку библиотек. Только для dlopen нашел.

Какой такой загрузка, сам же говоришь, что оно статически слинковано.

anonymous
()
Ответ на: комментарий от anonymous

Библиотека загружается на этапе старта приложения. Этим занимается линкер (грузит ее в память, инициализирует таблицы, выполняет *запикано* .init).

Сейчас пробую добавить в rootfs strace.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

А, оно таки динамически линкуется? Тем проще. strace ее. Ну или наоборот, собери статически. Гейзенбаги обычно так и ловятся, варьированием параметров (включая настройки оптимизации и погоду на Марсе).

Еще можешь под qemu подебажить.

anonymous
()
Ответ на: комментарий от cdshines

All the objects declared in this header share a peculiar property — you can assume they are constructed before any static objects you define, in a translation unit that includes <iostreams>. Equally, you can assume that these objects are not destroyed before the destructors for any such static objects you define. (The output streams are, however, flushed during program termination.) Hence, you can safely read from or write to the standard streams prior to program startup and after program termination.

Нашел такую штуку, но как это использовать?

cdshines ★★★★★
()
Ответ на: комментарий от anonymous

А, тьфу. По сравнению с той магией, которую я ожидал, это какое-то разочарование, я и сам додумался.

cdshines ★★★★★
()
Ответ на: комментарий от anonymous

Оскорблять льдом благородный напиток? Гнусная американщина!

anonymous
()
Ответ на: комментарий от cdshines

А оно не только с cout и cerr связано, это просто самая популярная часть стандартной библиотеки, где это используется. cout и cerr - это глобальные объекты, их «настройка» производится в конструкторе. Собственно сам вопрос про то, когда выполняются конструкторы глобальных объектов.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

«Можно ли вывести в консоль „hello world\n“ до старта main()?»

static int n = printf("Hello, world!\n");

int main() {return 0;}

это имеется в виду? %)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

mia culpa

признаЮ , сейчас знаю С++ много хуже , чем в конце 20 века.

открыл Страустропа - проникся - закрыл и решил забыть С++.

сейчас если мне понядобится компилируеме ООП предпочту Go|ObjC

C++ слишком сложен , Javа излишне интерпрайс

qulinxao ★★☆
()
Ответ на: комментарий от tailgunner

да, так тоже можно. Но имелись в виду конструкторы глобальных объектов.

DELIRIUM ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.