Чи можу я використовувати GDB для налагодження запущеного процесу?


Відповіді:


88

Так. Використовуйте attachкоманду. Перегляньте це посилання для отримання додаткової інформації. Введення help attachна консолі GDB дає наступне:

(gdb) help attach

Додайте до процесу чи файлу поза GDB. Ця команда приєднується до іншої цілі того ж типу, що і остання targetкоманда " info files" (" " покаже ваш цільовий стек). Команда може взяти за аргумент ідентифікатор процесу, ім'я процесу (з необов'язковим ідентифікатором процесу як суфікс) або файл пристрою. Для ідентифікатора процесу ви повинні мати дозвіл на надсилання сигналу процесу, і він повинен мати такий же ефективний uid, як і налагоджувач. Використовуючи " attach" для існуючого процесу, налагоджувач знаходить програму, що працює в процесі, спочатку шукаючи поточний робочий каталог або (якщо його там не знайдено), використовуючи шлях пошуку вихідного файлу (див. directoryКоманду " "). Ви також можете скористатися командою " file", щоб вказати програму та завантажити її таблицю символів.


ПРИМІТКА. У вас можуть виникнути труднощі з підключенням до процесу через покращену безпеку ядра Linux - наприклад, приєднання до дочірньої частини однієї оболонки з іншої.

Вам, ймовірно, потрібно буде встановити /proc/sys/kernel/yama/ptrace_scopeзалежно від ваших вимог. Зараз багато систем за замовчуванням до 1або вище.

The sysctl settings (writable only with CAP_SYS_PTRACE) are:

0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
    process running under the same uid, as long as it is dumpable (i.e.
    did not transition uids, start privileged, or have called
    prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
    unchanged.

1 - restricted ptrace: a process must have a predefined relationship
    with the inferior it wants to call PTRACE_ATTACH on. By default,
    this relationship is that of only its descendants when the above
    classic criteria is also met. To change the relationship, an
    inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
    an allowed debugger PID to call PTRACE_ATTACH on the inferior.
    Using PTRACE_TRACEME is unchanged.

2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
    with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.

3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
    PTRACE_TRACEME. Once set, this sysctl value cannot be changed.

8
Посилання розірвано :( З моєї точки зору, мені подобаються відповіді, як ця від J. Polfer . Cheers;)
olibre

Я полагодив посилання.
Attie

це також працює для пид процесу на віддаленій цілі?
Bionix1441

Ви повинні запустити сервер налагодження на віддаленій цілі; після цього воно повинно бути таким же.
Карл Норум

Прапор може бути змінено за допомогою echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope.
Дайсуке


24

Так. Ви можете зробити:

gdb program_name program_pid

Ярлик був би (якщо тільки один екземпляр запущений):

gdb program_name `pidof program_name`

Я не знаю, що це робить, але впевнений, що пекло для мене не працює. Там сказано, що <program_pid> не існує.
Сова

2
Я вважаю, що це найкраще працює, оскільки він завантажує таблицю символів на додаток до приєднання до процесу. Слід зазначити, що program_nameпрацює, якщо ви перебуваєте в тому самому каталозі, що і двійковий файл. Я думаю, що шлях до двійкового файлу спрацював би, якщо ви знаходитесь в іншому каталозі.
KarateSnowMachine

Ви не забули -pперед program_id? Також може знадобитися запустити gdb з sudo, щоб приєднатися до запущеного процесу.
mxmlnkn

15

Команда, яка використовується, - це те, gdb attach pidде pid - це ідентифікатор процесу, до якого ви хочете долучитись.


3

Так, ти можеш. Припустимо, що процес fooзапущений ...

пс -ельф | греп фу

шукайте номер PID

gdb -a {номер PID}

5
Над яким розподілом ви працюєте? Використовуючи останню версію Fedora, "gdb -a" друкує помилку "параметр -a - неоднозначна".
Джастін Етьє

1
офіційний аргумент - -p / - pid
Махмуд Аль-Кудсі

3

Якщо ви хочете долучити процес, цей процес повинен мати того самого власника. Корінь здатний приєднуватися до будь-якого процесу.


2

ps -elf, схоже, не показує PID. Я рекомендую використовувати замість цього:

ps -ld | grep foo
gdb -p PID

2

Найпростіший спосіб - надати ідентифікатор процесу .

gdb -p `pidof your_running_program_name`

Будь ласка, отримайте повний список опцій у man gdbкоманді.

У випадку, якщо для однієї і тієї ж програми працює декілька процесів, наступна команда перелічить процеси.

ps -C program -o pid h
<number>

Тоді ідентифікатор (номер) вихідного процесу може бути використаний як аргумент gdb.

gdb -p <process id>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.