LINUX.ORG.RU

Отладка c++ в gdb


0

1

Привет всем !

Пытаюсь отлаживать программу написанную на c++ под gdb, но не получается. Программа скомпилирована с ключем -g. Но:

(gdb) break main
Breakpoint 1 at 0x4039c0
(gdb) run

программа останавливается на main(), но если сказать next, то выполнится не следующая строка кода, а начнется исполнятся программа дальше ( как будто скомандовали continue )

почему не работает построчная отладка ? что не так делаю ?

«P.S. GNU gdb (Gentoo 7.2 p1) 7.2; gcc (Gentoo 4.5.2 p1.0, pie-0.4.5) 4.5.2 »


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

Да, конечно.

Но странность в другом, в точках останова.

Breakpoint 1, 0x00000000004039c0 in main ()
(gdb) break main.cpp:96
No source file named main.cpp.
Make breakpoint pending on future shared library load? (y or [n])

точка останова на ставится (((

почему ???

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

-ggdb = include debug info for GDB

Хотя странно, обычно -g достаточно :)

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

Как ему подсказать где он лежит, как сделать что бы он сам нашел ... ???

ну у меня сегодня libastral.a сбоит, так что давайте начнём с теории, может поможет?

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

dir dirname ...

Add directory dirname to the front of the source path. Several directory names may be given to this command, separated by `:' (`;' on MS-DOS and MS-Windows, where `:' usually appears as part of absolute file names) or whitespace. You may specify a directory that is already in the source path; this moves it forward, so gdb searches it sooner.

http://sourceware.org/gdb/onlinedocs/gdb/Source-Path.html

www.google.com

metawishmaster ★★★★★
()

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

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

Приложение это набор исходников + собственная библиотека (aaa.so). Все скомпилировано с ключами "-g -ggdb"

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

Пример:

lib:
void libA()
{
   cout<< "A";
}

main:
void main()
{
   libA();
   cout << "BBB";
   cout << "CCC";
   libA();
   cout << "B";
}

(gdb)break main
(gdb)step
(gdb)list
void libA()
{
   cout<< "A";
}
(gdb)step
BBBCCC
(gdb)list
void libA()
{
   cout<< "A";
}

Почему так ?

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

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

«The most effective debugging tool is still careful thought, coupled with judiciously placed print statements.»

Brian Kernighan


I don't like debuggers. Never have, probably never will. I use gdb all the time, but I tend to use it not as a debugger, but as a disassembler on steroids that you can program.

Linus Torvalds

anonymous
()

Собрал небось с оптимизацией и компилятор быдлокод похерил.

goose
()

Если отладочные символы есть, то gbd обязан указать строку
в которую ставится точка останова, например:

(gdb) b main
Breakpoint 1 at 0x4010ae: file main.cс, line 3.

Вывод никак не зависит от возможности получить доступ к источникам!

Это значит что отладочная информация была как-то удалена из файла,
нет ли использования strip-а и т.п.?

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

Заработало!! Я что-то напутал в cmake.

Переписал все на Makefile и все заработало.

Всем спасибо!!!

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