【问题标题】:Can strace debug an application being debugged by gdb?strace 可以调试 gdb 正在调试的应用程序吗?
【发布时间】:2019-06-23 07:58:49
【问题描述】:

背景

我正在使用 WSL(适用于 Linux 的 Windows 子系统)下的 gdb 8.3 调试 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 组合?

【问题讨论】:

标签: android debugging gdb strace


【解决方案1】:

我了解问题是申请流程不能 连接不止一次。

是的,这是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,在 希望运行应用程序并查看系统功能生成什么 崩溃时的违规信号。

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

【讨论】:

  • 虽然不像 strace 输出那样“漂亮”,但绝对是一种合乎逻辑的方法——谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2012-08-11
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多