我正在尝试使用诸如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)。