Невозможно создать точку останова в файле с помощью GDB - PullRequest
0 голосов
/ 22 апреля 2011
gdb GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-32.el5_6.2)
g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-50)

Компиляция со следующими флагами:

CFLAGS = -Wall -Wextra -Wunreachable-code -ggdb -O0

Я также пытался использовать только -g, но это тоже не сработало.

У меня есть файл вызова demo.cpp, и я пытаюсь создать точку останова в этом файле.

Моя исполняемая цель называется demo_app. Я запускаю GDB, используя следующее:

gdb demo_app

Я пытаюсь создать точку останова

b demo.cpp:997

GDB возвращает следующее сообщение:

No source file named demo.cpp.
Make breakpoint pending on future shared library load? (y or [n]) n

Свойства исполняемого файла:

ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

Однако у меня есть другой файл с именем video.cpp, и я могу создать точки останова в этом файле.

Большое спасибо за любой совет,

================== ОБНОВЛЕНИЕ Я сделал следующее:

(gdb) start
Temporary breakpoint 1 at 0x804ba44
Starting program: /home/user/video_demo/demo
warning: .dynamic section for "/lib/libc.so.6" is not at the expected address
warning: difference appears to be caused by prelink, adjusting expectations
warning: .dynamic section for "/lib/libuuid.so.1" is not at the expected address
warning: difference appears to be caused by prelink, adjusting expectations
[Thread debugging using libthread_db enabled]
[New Thread 0x1ab7b90 (LWP 5123)]

(gdb) b demo.cpp:1038
No source file named demo.cpp.
Make breakpoint pending on future shared library load? (y or [n]) n

================= MAKEFILE ========

OBJECT_FILES = demo.o video.o
CFLAGS = -Wall -Wextra -Wunreachable-code -ggdb -O0 
CC = g++ -m32
TARGET = demo

# Include path
INC_PATH = -I /usr/network/inc
INC_PATH+= -I sdp/inc

# Library path
LIB_PATH = -L /usr/network/lib
LIB_PATH+= -L sdp/lib

# Libraries to include
LIBS = -lnetwork -lsdpAPI -lpthread

# Linker run-time path
LDFLAGS = -Wl,-rpath=/usr/network/lib
LDFLAGS+= -Wl,-rpath=sdp/lib

$(TARGET): $(OBJECT_FILES)
    $(CC) $(CFLAGS) $(LDFLAGS) $(INC_PATH) $(OBJECT_FILES) $(LIB_PATH) $(LIBS) -o $(TARGET)

demo.o: demo.cpp video.cpp
    $(CC) $(CLFAGS) $(INC_PATH) $(LIB_PATH) $(SDP_LIB) -c demo.cpp

video.o: video.cpp
    $(CC) $(CFLAGS) $(INC_PATH) $(LIB_PATH) -c video.cpp

clean:
    rm -f $(OBJECT_FILES) $(TARGET) *~

Ответы [ 3 ]

3 голосов
/ 22 апреля 2011

В вашем make-файле есть ошибка - CLFAGS вместо CFLAGS в рецепте для demo.o.

Вы должны быть в состоянии уловить это, если вы посмотрите вывод при запуске make - вы увидите отсутствующие опции компилятора при построении только этого одного объекта, поскольку CLFAGS - пустая переменная.

И, конечно, есть что сказать, чтобы воспользоваться встроенными рецептами. Если вы сохраните все свои параметры в переменных, по умолчанию ожидайте, вам не придется переписывать рецепты и иметь такой шанс для опечаток. Например, добавьте $(INC_PATH) к CPPFLAGS. (И вам не нужно передавать какие-либо флаги компоновщика в шаги только для компиляции, как вы делаете.)

2 голосов
/ 22 апреля 2011

Существует несколько возможных объяснений:

  1. Наиболее вероятным является то, что demo.o (результат компиляции demo.cpp) не связан с конечным исполняемым файлом.Это может произойти, если вы поместите demo.o в архивную библиотеку, а ваш main.o не ссылается ни на какие символы из demo.o
  2. Ваш demo.o действительно не создан с флагом -ggdb
  3. В вашем GCC или GDB есть ошибка

Чтобы подтвердить или опровергнуть 1, запустите nm demo.o, затем nm demo_app и убедитесь, что присутствуют символы из demo.oв конечном исполняемом файле.

Чтобы подтвердить или опровергнуть 2, запустите make clean && make all > make.log 2>&1, а затем посмотрите, какая командная строка была на самом деле , используемой для сборки demo.o

Если вы можетеопровергнуть 1 и 2, тогда 3 - единственная возможность, о которой я могу думать в данный момент.Вы можете использовать readelf -w demo_app и посмотреть, есть ли в нем ссылки на demo.cpp.Если это не так, ошибка в GCC.Если это так, ошибка может быть либо в GCC, либо в GDB.

РЕДАКТИРОВАТЬ: Спасибо за предоставление Makefile.Вы создаете исполняемый файл с именем demo.Вы претендуете на отладку demo_app.PEBKAC

1 голос
/ 22 апреля 2011

Скажите start как вашу первую команду GDB.Пусть программа загрузится.Затем попробуйте установить точку останова.Тогда он не должен сообщать вам о будущей загрузке библиотеки.Предполагая, что точка останова установлена ​​так, как должно быть, выполните continue.

...