为啥要等待调试器,然后将调试器附加到进程?

Posted

技术标签:

【中文标题】为啥要等待调试器,然后将调试器附加到进程?【英文标题】:Why wait for debugger and then attach debugger to process?为什么要等待调试器,然后将调试器附加到进程? 【发布时间】:2020-01-24 09:50:23 【问题描述】:

有什么意义

android.os.Debug.waitForDebugger();

我知道我们 [有时] 需要使用 this function 来调试 Service,但我的问题是:

为什么我们必须这样做? 为什么存在这种方法?它还有什么其他用途? attach a debugger to a process 意味着什么,为什么我们必须这样做?为什么Service 必须以这种方式调试,而不是ActivityBroadcastReceiver

人们会认为在项目中调试任何类型的代码都很简单。除非它不是。无论如何都不是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,而不是 Activity 或 BroadcastReceiver?

这是另一个问题,我不确定这里的上下文,但是。我们需要调用该方法,并手动附加到流程,其中我们的Service 使用清单中的另一个流程。很明显debug bridge会设置在当前活动进程和application,但是由于我们可以从另一个进程运行Service,所以我们需要手动将它添加到debug bridge,等待debug连接。

【讨论】:

非常有趣。这正是我想要的,有更多的细节和例子。默认情况下,Service 是否始终与 App 在同一进程中运行? @Y.S 抱歉,因为工作场所变动而很忙)Service 总是在与应用程序相同的进程中运行。除非您在清单中更改它,否则为什么可以让Service 在另一个进程中工作? 对于应用程序和后台应该分开工作的情况。只是为了前。 Player。通过关闭播放器应用程序,您正在破坏它的进程,但您需要继续播放音乐。要通过活跃的音乐保持任务的活力,您可以使用单独的进程 Service @Y.S 另一个非常棘手的例子是使用 Service 和单独的进程,这是因为处理本机崩溃。默认情况下,您不能在本机库中捕获异常。相反,您可以使用另一个进程将本机杠杆放在Service 中,并创建Binder 进行通信。如果发生崩溃,您的后台服务将关闭,但主应用程序继续工作。并且可以再次重启服务。

以上是关于为啥要等待调试器,然后将调试器附加到进程?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法将调试器附加到已签名的 apk 进程?

vs2017 调试附加进程 结束进程为啥很卡慢

VS调试技巧之附加进程

Visual Studio 附加到进程调试

vs2012已附加有调试器,但是没有将该调试器配置为调试此未经处理的异常

初次使用VS附加到进程功能