LINUX.ORG.RU

Как заставить отладчик пройтись по инициализациям до main()?

 ,


0

1

Есть большой-большой проект, и в нем куча инициализируемых до main переменных. Как перебрать код их инициализаций (конструкторы, или другое что есть) в отладчике - отладчик сразу выходит на main. Пробовал в IDE Eclipse. Или хотя бы в gdb - но там он останавливается только на брекпоинтах, непонятно какой командой запустить: run - сразу идет до брекпоинта, который непонятно куда ставить.

В gdb сделай info file и поставь брякпойнт на адрес entry point

anonymous
()

Коротко: в линуксе для С++ ставь брейкпоинт на _start.

Чуть длинее. _start – стандартный entrypoint. Если он не подходит, узнать актуальную точку входа всегда можно выполнив в gdb 'info file <exe>'.

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

Ссылку на ман, где это явно описывается, или балабол.

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

Попробовал, в моем случае стартовая процедура mainCRTStartup - в эклипсе в отладчике подсмотрел. На нее можно поставить брекпоинт, но от нее шагает только при поассемблеровским командам. И в gdb и в Eclipse. А если сделать шаг не ассемблеровский (s а не si) - то происходит безостановочное выполнение.

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

Могу предположить, что дело в Эклипсе, а точнее, его entrypoint-е. Если взять какой-нибудь тестовый исходник, скомпилировать его и strip-нуть, то тоже не получится «шагать по строкам». Если не стрипать – все ок:

[root@localhost vagrant]# g++ -g test.cpp -o test
[root@localhost vagrant]# gdb test
GNU gdb (GDB) Fedora 7.9.1-20.fc22

...

Reading symbols from test...done.
(gdb) b _start
Breakpoint 1 at 0x400500
(gdb) r
Starting program: /home/vagrant/test 

Breakpoint 1, 0x0000000000400500 in _start ()
(gdb) s
Single stepping until exit from function _start,
which has no line number information.
__libc_start_main (main=0x400607 <main()>, argc=1, argv=0x7fffffffe558, init=0x400680 <__libc_csu_init>, fini=0x4006f0 <__libc_csu_fini>, 
    rtld_fini=0x7ffff7deba60 <_dl_fini>, stack_end=0x7fffffffe548) at libc-start.c:134
134	{

...

Попробуй собрать программу без Эклипса. Ну во всяком случае у меня других идей нет.

staseg ★★★★★
()

отладчик сразу выходит на main

Где-то в настройках отладчика должна быть галка «Go to main() on restart» или что-то в этом роде. Если убрать — будет стартовать с cinit или откуда там оно запускается.

alegz ★★★★
()

Будь мужиком - дизассемблируй и сразу ответишь на все свои вопросы. А если по честному - какое-то говно получается, если приходится изучать ту секцию. Там находятся вещи, которые никак не должны волновать разработчика (в массовом количестве случаев). Полагаю, кто-то нечто подобное синглтонам использует в глобальной памяти и соответственно огребает проблемы. Может стоит перейти на нормальное выделение памяти под объекты?

Может и не прав, но по типу вопроса чувствую сильновероятный неверный подход к задаче. Привёл бы ссылку на opennet с описанием того, что происходит с момента запуска до функции main, но не нашёл в закладках. В принципе дизасемблируй void main(){}, погугли вызываемые функции и все сам поймешь.

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