我正在尝试使用诸如APKTOOL,Smali之类的工具以及诸如Eclipse和NetBeans之类的IDE来测试黑盒测试APK的方法。我拥有所需的大部分东西-我可以反编译/调试仪器/重新编译/签名/对齐并在设备上运行。

我遇到的问题是在连接调试器后设置断点(在Smali代码中设置了断点)。似乎断点未提交给Dalvik或Dalvik不遵守断点。无论哪种方式,当程序遇到断点时调试器都不会捕捉。一些研究表明我可能需要Debug.waitForDebugger。 (http://stackoverflow.com/questions/3107587/android-with-jdb-confusion-using-waitfordebugger)。

假设下一个障碍是waitForDebugger,则在调整本地堆栈后,可以使用Smali语法和invoke-static {}, Landroid/os/Debug;->waitForDebugger()V插入它。

我的问题是,我该在哪里插入对waitForDebugger的呼叫?我应该在静态构造函数(MainActivity),实例构造函数(clinit),init还是其他位置中选择(从清单中)? Eclipse,NetBeans等IDE在其调试版本中如何做到这一点?

最佳答案

上述问题的简短答案是将其放在MainActivity.onCreate中。

Dima在APKTOOL错误报告中提供的详细答案指出Debug.waitForDebugger是不可靠的,我们应该旋转等待调试器附加:

boolean debuggerAttached = false;
while(!debuggerAttached ) { ; }


在此错误报告中引用他的答案:NetBeans/Smali Debugging is Broken (SmaliDebugging Page)

07-27 14:03