никаких символов (только вопросительные знаки) в трассировке стека в удаленном gdb

У меня есть относительно простое приложение (со ссылками на другую простую библиотеку), которое не позволяет мне удаленно отлаживать его с помощью gdb. Я проверил, совпадают ли версии gdb и gdbserver. На самом деле это даже одна и та же ОС (ubuntu) на обеих машинах. Кажется, он успешно загружает символы из исполняемого файла. Так что я немного растерялся, что может быть не так. Любые предложения приветствуются. Вот расшифровка из gdb:

dev:/fast/git/archive/foo$ gdb /fast/git/foo 
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /fast/git/foo...done.
(gdb) target remote test1:5000
Remote debugging using test1:5000
Reading /lib64/ld-linux-x86-64.so.2 from remote target...
warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead.
Reading /lib64/ld-linux-x86-64.so.2 from remote target...
Reading symbols from target:/lib64/ld-linux-x86-64.so.2...Reading /lib64/ld-2.23.so from remote target...
Reading /lib64/.debug/ld-2.23.so from remote target...
(no debugging symbols found)...done.
0x00007ffff7dd7cc0 in ?? () from target:/lib64/ld-linux-x86-64.so.2
(gdb) bt
#0  0x00007ffff7dd7cc0 in ?? () from target:/lib64/ld-linux-x86-64.so.2
#1  0x0000000000000003 in ?? ()
#2  0x00007fffffffce02 in ?? ()
#3  0x00007fffffffce2f in ?? ()
#4  0x00007fffffffce32 in ?? ()
#5  0x0000000000000000 in ?? ()

Ах, так интересно. Я до сих пор не уверен, почему, но он печатает только это (фиктивная трассировка стека) при подключении. Если я затем «продолжу», он с радостью напечатает правильные символы, если я вызову перерыв.

Странно... может быть, это отчасти ошибка пользователя, но я ожидал, что он запустится и сломается при запуске на main, когда я подключился.


person rivenmyst137    schedule 07.09.2016    source источник
comment
Как вы скомпилировали эту программу? Какая команда?   -  person Fantastic Mr Fox    schedule 08.09.2016
comment
gcc -std=c99 -D_GNU_SOURCE -O0 -g3 -Wall -c -fmessage-length=0 -ggdb -fPIC -MMD -MP -MFfoo.d -MTfoo.o -o foo.o ../foo.c компоновщик: gcc -L../../library/Debug -o битбакет ./bitbucket.o -лентангл -lrt   -  person rivenmyst137    schedule 08.09.2016


Ответы (3)


Я немного в растерянности, что может быть не так

Возможно, ничего плохого нет.

Вот что я получаю на локальной машине:

gdbserver :0 /bin/date
Process /bin/date created; pid = 132826
Listening on port 57966
Remote debugging from host 127.0.0.1

В отдельном окне:

gdb -q /bin/date
(gdb) target remote localhost:57966
Remote debugging using localhost:57966
Loading symbols for shared libraries.
Loading symbols for shared libraries.
0x00007ffff7ddb2d0 in _start () at rtld.c:871
871 rtld.c: No such file or directory.
(gdb) bt
#0  0x00007ffff7ddb2d0 in _start () at rtld.c:871
#1  0x0000000000000001 in ?? ()
#2  0x00007fffffffe157 in ?? ()
#3  0x0000000000000000 in ?? ()

Что здесь происходит, так это то, что gdbserver очень рано остановил подчиненный (отлаживаемый) процесс. До того, как загрузчик обнулил стек, и до входа в main.

Символы для основного исполняемого файла уже должны быть загружены, и вы должны иметь возможность устанавливать на них точки останова. Установите точку останова на main и просто продолжайте оттуда, и вскоре вы увидите, что ваша точка останова сработала.

Обновление:

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

Ваше ожидание неверно.

В типичном динамически связанном двоичном файле между _start и переходом к main есть тысячи инструкций. Иногда эти инструкции являются теми, где происходит сбой. Если бы GDB автоматически продолжал main, не давая вам возможности установить точки останова или точки наблюдения, то отладка таких сбоев была бы намного сложнее, чем сейчас.

person Employed Russian    schedule 07.09.2016

Несколько идей:

Убедитесь, что удаленная программа и общие библиотеки скомпилированы с ключом -g для добавления символов отладки. Сообщение (no debugging symbols found) может означать, что символы отладки отсутствуют во всем исполняемом файле.

Убедитесь, что локальная и удаленная программа — это один и тот же образ. Вы можете сделать «сумму» по каждому. Это может быть проблемой, так как строка #1 0x0000000000000003 in ?? () выглядит поврежденной.

Вы можете вручную отладить цель на удаленном поле? Если это так, проверьте символы, чтобы узнать, связано ли это с сеансом удаленной/локальной отладки. Вы можете проверить символы отладки, выполнив list <function>

Диапазоны адресов часто сопоставляются одинаково в локальной системе и удаленной. Вы можете разобрать адрес в локальном сеансе отладки и посмотреть, какой функции/методу он соответствует. Это может быть полезно, если удаленная программа дает сбой, по крайней мере, вы можете понять, в чем проблема.

person Matthew Fisher    schedule 07.09.2016

При удаленной отладке клиент gdb не знает, откуда загружать символы. У вас есть два варианта:

1. specify executable when starting gdb

gdb <executable>
(gdb) target remote <IP>:<port>
(gdb) load <executable>
 gdb should know symbols now
(gdb) b main
(gdb) mon reset
(gdb) contnue
 it should break at main
(gdb) bt

2. use file command to tell about the symbols.

gdb
(gdb) target remote <IP>:<port>
(gdb) load <executable>
(gdb) file <executable>
 gdb should know symbols now
(gdb) b main
(gdb) mon reset
(gdb) contnue
 it should break at main
(gdb) bt
person Mohammad Azim    schedule 11.12.2017