strace可以调试由gdb调试的应用程序吗?

时间:2019-06-23 07:58:49

标签: android debugging gdb strace

背景

我正在使用gdb 8.3在WSL(Linux的Windows子系统)下调试Android应用程序。调试我的应用程序gdb时,通常会在会话中的不一致点频繁捕获SIGSEGV和其他终止应用程序的信号。在没有gdb的情况下运行应用程序时,不会出现这些信号。我有充分的理由相信gdb是不稳定的根源。

因此,我想使用strace来监视正在运行的gdb-app,以期锻炼该应用程序并查看崩溃时哪个系统函数会生成令人反感的信号。

问题

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 个答案:

答案 0 :(得分:2)

  

我了解问题是申请流程无法   附加了多个。

是的,这是ptrace()系统调用的限制,请参见ERRORS section in 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).
  

因此,我想使用strace监视正在运行的gdb-app,   希望锻炼该应用程序并查看生成的系统功能   崩溃时发出令人反感的信号。

相反,您可以在应用程序崩溃时看到回溯。您可能会看到一些系统函数正在生成信号或其他您不期望的东西。