背景
我正在 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 组合?
我了解问题是申请流程无法 附着不止一次。
是的,这是
ptrace()
系统调用的限制,请参阅man ptrace中的ERRORS部分:
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,在 希望使用该应用程序并查看系统功能会生成什么 崩溃时发出有问题的信号。
相反,当应用程序崩溃时,您可以看到回溯。您可能会看到一些系统函数生成信号或其他您不期望的东西。
是的,你可以(至少在类似 RHEL 的发行版上)。请参阅 https://developers.redhat.com/blog/2020/03/16/extending-gdbserver-to-support-an-strace-client#extending_strace_to_support_gdbserver 他们在最后解释说,该作品尚未合并到上游,但可在自定义存储库中进行测试。您仍然可以获得补丁并在您的发行版中应用,以便您享受此功能。
在 *BSD 中,您可以使用
ktrace
实用程序/系统调用。 dtruss
和 truss
都使用 ptrace
。