LINUX.ORG.RU

как увидеть src код с ошибкой при отладке?


0

0

Например:<br>

main.cpp<br> --------------------<br> #include <stdio.h><br> #include <stdlib.h><br> <br> int main(void)<br> {<br> int a[2];<br> a[0] = 2;<br> a[1] = 2;<br> a[2] = 2;<br> a[3] = 1;<br>

return 0;<br> }<br> --------------------<br><br>

$ g++ -g main.cpp<br><br>

$ ./a.out<br> segmentation fault (core dumped) ./a.out<br><br>

$ gdb a.out core<br> GNU gdb 19991004<br> Copyright 1998 Free Software Foundation, Inc.<br> GDB is free software, covered by the GNU General Public License, and you are<br> welcome to change it and/or distribute copies of it under certain conditions.<br> Type "show copying" to see the conditions.<br> There is absolutely no warranty for GDB. Type "show warranty" for details.<br> This GDB was configured as "i386-redhat-linux"...<br> Core was generated by `./a.out'.<br> Program terminated with signal 11, Segmentation fault.<br> Reading symbols from /usr/lib/libstdc++-libc6.1-1.so.2...done.<br> Reading symbols from /lib/libm.so.6...done.<br> Reading symbols from /lib/libc.so.6...done.<br> Reading symbols from /lib/ld-linux.so.2...done.<br> #0 0x1 in ?? ()<br> (gdb)<br><br>

и где же ошибка? - не понятно ...<br>

anonymous

командочка bt в gdb поможет все увидеть;))

А вообще почитай для начала хотя бы info gdb - очень помогает ;))))

tvn
()

bt говоришь, вот:

(gdb) bt #0 0x00000001 in ?? () (gdb)

как все понятно блин

а доки я смотрел - но ничего путного по этому поводу не нашел

anonymous
()

ну правильно - весь стек перезаписал и хочешь в нем что то путное увидеть?
а немного путного всеже есть - видим что в стеке записано 0x00000001 - кто это мог туда его записать? ну конечно же a[3]=1;
вот тебе и src код с ошибкой и при отладке .. :)

lg ★★
()

я вообще-то хотел с самого начала имя файла с номером строки где ошибка, хотя бы! Представь большой проект - там не догадаешься. Это здесь все понятно.

anonymous
()

что значит где ошибка? в программе нет ошибок .. иначе бы она не компилировалась
а показать кто и где перезаписал стек тебе gdb не покажет - core file это всего лишь лейаут памяти данного процесса в какой то промежуток времени - а у тебя там в момент seg faulta весь стек уже перезаписан

lg ★★
()

Разве проблема не понятна?

Проект - 1000000 срок

Выпадает в core gdb говорит:

#0 0x4010a9fc in malloc () from /lib/i686/libc.so.6 Cannot access memory at address 0x7413f3a4

тут уже никто не в силах помочь.

anonymous
()

У ты, видишь ли, очень гадкая ошибка. Выход за границы отведённой памяти -- тут _никакой_ отладчик тебе не помощник. Ладно, в твоём примере ошибка вылазит сразу -- но ведь в программе из 1000000 строк она вылезет строк эдак через пару тыщ после ошибочной!

Тут -- меняй язык, либо пользуй более сложные механизмы работы с массивами (объекты), либо ещё чего-нить столь же глобальное...

С уважением -- Смоляное Чучелко

anonymous
()

коротко прогу компиляеш с опцией -g
открываеш сам бинарник проги
gdb proga
указываеш где лежат твои исходники
открываеш core фаил прям такая команда core file
ну а теперь смотри команды gdb по высвечиванию твоего стека
кто куда и откуда вызывает. Удачи в поисках утечек).

Aleks_IZA
()

Вот это появляется, если компилировать g++ 2.96 #0 0x4010a9fc in malloc () from /lib/i686/libc.so.6 Cannot access memory at address 0x7413f3a4

Если же взять g++-3.2, то эта ошибка больше не появлялась !!!!!!!!!!!

Не пользуйте гребанный g++ 2.96 !!!!!!!!!!!!!!!!!!!1

anonymous
()

1) В какой строчке прога в корку упала: 
$ gdb -c core program
, где core - сама корка, program - имя исполняемого файла, 
скомпиленного с ключиком -g
2) Вот те инструмент ( не знаю насколько будет полезен ) - 
http://dmalloc.com, который поможет собрать некоторую статистку, если
его сумеешь прикрутить к твоей проге.

PETER ★★
()

блин, g++-3.2 тоже не спас :(

При чем тут вообще malloc () from /lib/i686/libc.so.6, если в программе только new и delete используются.

gdb -c core program - это тоже самое что и gdb program core

anonymous
()

С помощью g++-3.2 удалось все же кое-что раскопать:

#0 0x4018a701 in malloc () from /lib/i686/libc.so.6 (gdb) bt #0 0x4018a701 in malloc () from /lib/i686/libc.so.6 #1 0x4018a262 in malloc () from /lib/i686/libc.so.6 #2 0x400c87fe in operator new(unsigned) () from /usr/lib/libstdc++.so.5 #3 0x0804e152 in Servlet(void*) (sp=0x45301550) at main.cpp:325 #4 0x400206c1 in pthread_exit () from /lib/i686/libpthread.so.0 (gdb)

Т.е. "at main.cpp:325" это уже результат!

Посмотрим как будет дальше...

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

А new как по-твоему память-то под объекты выделяет?

Oakhead
()

да я понял, но кнопку нажал по инерции :)

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