Как я могу отлаживать функции в библиотеках общих объектов с GDB? - PullRequest
4 голосов
/ 11 января 2020

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

Допустим, у меня есть add.c:

long add(long x, long y) {
    return x + y;
}

Я компилирую это с gcc -shared -o libadd.so -fPIC add.c и загружаю в GDB:

(gdb) file libadd.so
Reading symbols from libadd.so...(no debugging symbols found)...done.
(gdb) start
Function "main" not defined.
Make breakpoint pending on future shared library load? (y or [n])
Starting program: /tmp/minimal/libadd.so

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000001 in ?? ()

Предпочтительно, я хотел бы иметь возможность использовать GDB, как показано ниже:

(gdb) file libadd.so
Reading symbols from libadd.so...(no debugging symbols found)...done.
(gdb) call (long)add(5,6)
$1 = 11

Но этот вызов приводит к You can't do that without a process to debug.

Могу ли я отлаживать подобные библиотеки в GDB?

1 Ответ

3 голосов
/ 11 января 2020

Вы можете сделать это с помощью starti, как показано ниже:

(gdb) file libadd.so
Reading symbols from libadd.so...(no debugging symbols found)...done.
(gdb) starti
Starting program /tmp/minimal/libadd.so

Program stopped.
0x00007ffff7dfd4a0 in deregister_tm_clones ()
(gdb) call (long)add(5,6)
$1 = 11

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

...