经过几个月几个人的摸索(当然不是一直在解决这个问题),终于解决CodeBlocks不能调试Android Native C程序的问题,现共享一下,免得大家浪费时间(不过也不一定是浪费时间,因为这个过程也能学到不少东西)。
开发环境:
Windows XP + Cygwin + Android NDK 1.6 + CodeBlocks8.02
问题描述:
使用gdbserver和CodeBlocks调试时,直接运行没有问题,但若设定断点,CodeBlocks出现打开源代码文件失败的错误,并且不能定位到源代码文件的断点位置。
另外CodeBlocks编译Android Native C程序没有问题,上传到模拟器或实机运行也没有问题,使用gdbserver和gdb调试也没有问题。
最终解决方案:
运行如下脚本,在cygwin的安装目录下创建register.bat文件,把下面的内容拷入保存,单击执行。
set "curpath=%cd%"
set "curpath=%curpath:\=\\%"
set "regname=register.REG"
if exist %regname% del %regname%
echo REGEDIT4>>%regname%
echo.>>%regname%
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Cygnus Solutions\Cygwin]>>%regname%
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Cygnus Solutions\Cygwin\mounts v2]>>%regname%
echo "cygdrive prefix"="/cygdrive">>%regname%
echo "cygdrive flags"=dword:00000020>>%regname%
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Cygnus Solutions\Cygwin\mounts v2\/]>>%regname%
echo "native"="%curpath%">>%regname%
echo "flags"=dword:00000008>>%regname%
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Cygnus Solutions\Cygwin\mounts v2\/usr/bin]>>%regname%
echo "native"="%curpath%\\bin">>%regname%
echo "flags"=dword:00000008>>%regname%
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Cygnus Solutions\Cygwin\mounts v2\/usr/lib]>>%regname%
echo "native"="%curpath%\\lib">>%regname%
echo "flags"=dword:00000008>>%regname%
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Cygnus Solutions\Cygwin\Program Options]>>%regname%
regedit /s "%regname%"
|
问题的原因分析(调试CodeBlocks代码 + 猜测的结果):
1. 使用Android NDK提供的tool chain编译时,arm-eabi-g++.exe会把dos风格的路径转换成linux风格的路径。
2. 当程序运行到断点位置后gdbserver发回"0x20/cygdrive/..."的文件路径和行数。
3. CodeBlocks收到该文件路径后,试着打开该文件,这时它会到cygwin的注册表“
HKEY_LOCAL_MACHINE\SOFTWARE\Cygnus
Solutions\Cygwin\mounts v2
”项中查找mount表,对linux风格路径进行转换,若注册表中没有这一项,则转换失败,导致源代码文件打开失败,无法定位到源代码文件。
4. 根本原因(猜测),cygwin的安装程序在注册表中填写的数据不能满足CodeBlocks的需要导致上述问题。
参考:
http://blog.csdn.net/superbeck/archive/2008/11/05/3226709.aspx
阅读(1014) | 评论(1) | 转发(0) |