背景
我正在使用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组合上?
答案 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, 希望锻炼该应用程序并查看生成的系统功能 崩溃时发出令人反感的信号。
相反,您可以在应用程序崩溃时看到回溯。您可能会看到一些系统函数正在生成信号或其他您不期望的东西。