为啥要等待调试器,然后将调试器附加到进程?
Posted
技术标签:
【中文标题】为啥要等待调试器,然后将调试器附加到进程?【英文标题】:Why wait for debugger and then attach debugger to process?为什么要等待调试器,然后将调试器附加到进程? 【发布时间】:2020-01-24 09:50:23 【问题描述】:有什么意义
android.os.Debug.waitForDebugger();
我知道我们 [有时] 需要使用 this function 来调试 Service
,但我的问题是:
Service
必须以这种方式调试,而不是Activity
或BroadcastReceiver
?
人们会认为在项目中调试任何类型的代码都很简单。除非它不是。无论如何都不是Service
。
这个特殊程序存在的原因是什么?它还有什么用途?
等到调试器附加。一旦调试器附加,它就会返回,因此如果您想立即开始跟踪,则需要在 waitForDebugger() 调用之后放置一个断点。
为什么仍未得到解答。
更新:
我发现了这个功能的一个用例:当一个 Android 应用程序在应用程序进程被终止后自动重启时。当用户在应用程序设置中切换运行时权限时,该进程将被终止。更一般地说,应用程序进程会在任何时候被杀死并重新启动......
android.os.Process.killProcess(android.os.Process.myPid());
被调用。
要在进程重启后调试应用程序,请在代码中写入android.os.Debug.waitForDebugger()
,然后将调试器附加到当前进程。
Android: how to debug app's start-up process.
这是此功能的一个用例。
参考文献:
Debugging a service.
A proper way to Debug a Service in Android Studio?.
Breakpoint in service not working.
How to debug an Android Background Service?.
How to debug a Service?.
How to Attach debbuger to process from the first line without compile code every time.
you can attach a debugger after the app is already open.
可能相关:
Accessibility service disabled upon each debug run
When using the Java debugger in Intellij what does “Drop Frame” mean?
Configure on-device developer options.
Test your service.
Force application to restart from first Activity.
【问题讨论】:
试图关闭/否决此问题的人既不知道答案,也无法回答。我发布了这个问题,因为没有人问过。 谁在official android documentation 中说需要android.os.Debug.waitForDebugger()
才能调试Service
的代码?
不,这不是真的:服务代码没有以活动代码以外的任何其他方式处理
这个问题确实很有趣,但是太宽泛了。
是的,我第一次尝试:我在onStartCommand
的第一行设置了一个断点并调用了startService
,并且调试器在该断点处停止 - 如果您使用的是在不同环境中运行的服务处理而不是原始包,然后在您的问题中明确写入 - 正常服务正常工作
【参考方案1】:
我不确定我的回答是否正确,因为您可能会期望里面有复杂的见解。实际上,有一个非常直接的过程来连接和拦截过程响应。
为什么会有这种方法?它还有什么其他用途?如您所见,回答这个问题非常简单。由于进程拦截期间的竞争条件,您将无法在早期断点处停止,应致电waitForDebugger()
。在最常见的地方,比如Service
调试和Application
。
这是另一个问题,我不确定这里的上下文,但是。我们需要调用该方法,并手动附加到流程,其中我们的Service
使用清单中的另一个流程。很明显debug bridge会设置在当前活动进程和application,但是由于我们可以从另一个进程运行Service
,所以我们需要手动将它添加到debug bridge,等待debug连接。
【讨论】:
非常有趣。这正是我想要的,有更多的细节和例子。默认情况下,Service
是否始终与 App 在同一进程中运行?
@Y.S 抱歉,因为工作场所变动而很忙)Service
总是在与应用程序相同的进程中运行。除非您在清单中更改它,否则为什么可以让Service
在另一个进程中工作? 对于应用程序和后台应该分开工作的情况。只是为了前。 Player
。通过关闭播放器应用程序,您正在破坏它的进程,但您需要继续播放音乐。要通过活跃的音乐保持任务的活力,您可以使用单独的进程 Service
。
@Y.S 另一个非常棘手的例子是使用 Service
和单独的进程,这是因为处理本机崩溃。默认情况下,您不能在本机库中捕获异常。相反,您可以使用另一个进程将本机杠杆放在Service
中,并创建Binder
进行通信。如果发生崩溃,您的后台服务将关闭,但主应用程序继续工作。并且可以再次重启服务。以上是关于为啥要等待调试器,然后将调试器附加到进程?的主要内容,如果未能解决你的问题,请参考以下文章