Может ли strace отладить приложение, отлаживаемое с помощью gdb? - PullRequest
0 голосов
/ 23 июня 2019

Фон

Я отлаживаю приложение Android, используя gdb 8.3 под WSL (Подсистема Windows для Linux). При отладке мое приложение gdb часто перехватывает SIGSEGV и другие сигналы, которые завершают работу приложения, как правило, в несовместимых точках сеанса. Эти сигналы не появляются при запуске приложения без gdb. У меня есть веские основания полагать, что gdb является источником нестабильности.

Поэтому я хочу отслеживать запущенное приложение gdb, используя strace, в надежде проверить приложение и посмотреть, какая системная функция генерирует сигнал сбоя при сбое.

Проблема

strace не может подключиться к отлаженному приложению gdb для Android, поскольку оно не может подключиться к уже присоединенному процессу.

Вот команда gdbserver для присоединения к запущенному процессу:

dreamlte:/data/local/tmp # ./gdbserver :9999 --attach 26060
Attached; pid = 26060
Listening on port 9999
Remote debugging from host 127.0.0.1

Я запускаю gdb, который подключается к запущенному приложению.

Когда gdb подключен к приложению Android, я пытаюсь присоединить strace к приложению:

127|dreamlte:/data/local/tmp # ./strace -p 26060
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted

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

Есть ли способ присоединить strace к запущенной комбинации gdb-app?

1 Ответ

2 голосов
/ 23 июня 2019

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

Да, это ограничение системного вызова ptrace(), см. Раздел ОШИБКИ в man ptrace :

EPERM  The specified process cannot be traced.  This could be because
       the tracer has insufficient privileges (the required
       capability is CAP_SYS_PTRACE); unprivileged processes cannot
       trace processes that they cannot send signals to or those
       running set-user-ID/set-group-ID programs, for obvious
       reasons.  Alternatively, the process may already be being
       traced, or (on kernels before 2.6.26) be init(1) (PID 1).

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

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

...