ERROR: Non-debuggable application installed on the target device. Please re-install the debuggable version!
注意,本文的描述,必须完全满足下面的条件,并且要确定已经在编译ndk的时候,已经使用了 NDK_DEBUG=1。并且打包APK的时候已经包含gdbserver,gdb.setup。
最近在调试NDK的时候,发现一个比较棘手的问题,一直报告错误“ERROR: Non-debuggable application installed on the target device. Please re-install the debuggable version! ”如下面所示:
|
1 2 3 4 5 |
$ ndk-gdb WARNING: The shell running this script isn't bash. Although we try to avoid bashism in scripts, things can happen. /path_ndk/ndk-gdb: 214: /path_ndk/ndk-gdb: Bad substitution ERROR: Non-debuggable application installed on the target device. Please re-install the debuggable version! |
要求ndk-gdb输出详细的执行过程如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ ndk-gdb.py --force --verbose Android NDK installation path: /Android/android-ndk-r10e ADB version found: Android Debug Bridge version 1.0.31 Using ADB flags: Using auto-detected project path: . Found package name: com.xxxx.xxxx ABIs targetted by application: Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 14 in ./AndroidManifest.xml Device API Level: 18 Device CPU ABIs: armeabi-v7a armeabi Compatible device ABI: Using gdb setup init: Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 14 in ./AndroidManifest.xml Using toolchain prefix: Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 14 in ./AndroidManifest.xml Using app out directory: Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 14 in ./AndroidManifest.xml Found debuggable flag: true ERROR: Could not find gdbserver binary under ./libs/ This usually means you modified your AndroidManifest.xml to set the android:debuggable flag to 'true' but did not rebuild the native binaries. Please call 'ndk-build' to do so, *then* re-install to the device! |
可以观察到几个奇怪的地方,比如,报错的地方提示"ERROR: Could not find gdbserver binary under ./libs/" ,正常情况下,应该是"./libs/armeabi-v7a","./libs/armeabi"之类的东西,并且“Compatible device ABI: ”部分,是不应该输出为空的情况的。这说明,没有正确的读取到APK中的关于CPU相关的数据。另外,注意这句话“WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 14 in ./AndroidManifest.xml”
庆幸的是,Google提供了Python版本的ndk-gdb 因此,我们在Ubuntu 15.04下面使用Spyder来跟踪调试,观察到底哪里出了问题。
设置如下:

调整需要跟踪调试的目录到工程中正常执行ndk-gdb所在的目录:

跟踪之后发现问题如下图所示:

也就是说,当AndroidManifest.xml中设置的版本号“<uses-sdk android:minSdkVersion="14" />”跟在 Application.mk 中设置的版本号“APP_PLATFORM := android-19”,当两者不一致的时候,会导致返回的APP_ABIS不是正常情况下的"[armeabi,armeabi-v7a]"这种形式的返回,而是返回了错误信息的详情,而这个仅仅是个警告而已,也就是说是Google 的一个BUG.
了解了原因,就比较好解决问题了,只要两者修改成为一致就可以了。
TortoiseSVN客户端重新设置用户名和密码
在第一次使用TortoiseSVN从服务器CheckOut的时候,会要求输入用户名和密码,这时输入框下面有个选项是保存认证信息,如果选了这个选项,那么以后就不用每次都输入一遍用户名密码了。
不过,如果后来在服务器端修改了用户名密码,则再次检出时就会出错,而且这个客户端很弱智,出错之后不会自动跳出用户名密码输入框让人更新,我找了半天也没找到修改这个用户名密码的地方。
最终,找到两种解决办法:
办法一:在TortoiseSVN的设置对话框中,选择“已保存数据”,在“认证数据”那一行点击“清除”按钮,清楚保存的认证数据,再检出的时候就会重新跳出用户名密码输入框。
如果方法一不起作用,则可以采用方法二:
Tortoise的用户名密码等认证信息都是缓存在客户端文件系统的这个目录:
|
1 |
C:/Documents and Settings/Administrator/Application Data/Subversion/auth |
删除auth下面的所有文件夹,重新连接远程服务器进行检出,对话框就会出现!
Linux下查看so导出函数列表
1.只查看导出函数
|
1 |
$objdump -tT 7z.so |
2.查看更详细的二进制信息
|
1 |
$readelf -a 7z.so |
注意,使用readelf读取函数列表的时候,如果函数名比较长,可能会在显示的时候被截断,如果只查看导出函数,建议使用 objdump命令。
3.查看链接的库
|
1 |
$ldd 7z.so |
objdump,readelf,nm,ldd命令不能在Cygwin中使用
Windows下使用命令行执行需要用SSH keys登录的Git
Windows下使用Git的时候,大家都习惯了使用TortoiseGit来执行操作。但是在某些情况下,必须在Git Bash下面执行命令的时候,就比较麻烦了,尤其是服务器设置了SSH keys登陆的时候。默认情况下,TortoiseGit会自动加载puttygen生成的.PPK文件来完成认证工作,但是在Git Bash 下面,只能是根据Linux下面的配置来进行登陆认证了。
1.在Git Bash中输入“puttygen”,如下图所示:
弹出如下图形界面:
对于已经有PPK文件的情况,点击"Load"来加载,没有PPK文件,请点击"Generate"来生成。加载完成后,点击菜单上的“Conversions”按钮,如下图所示:
导出的文件没有扩展名,命名为“id_rsa”,注意,必须是这个名字,没有扩展名。
2.拷贝文件“id_rsa”到当前用户目录下面的 “.ssh”目录下面,当前用户目录的位置,请在Git Bash中输入“echo ~”来显示出来,最后的结果如下图所示
3.在Git Bash中继续执行命令,就可以了!
将已有的Git项目的某个目录分离成独立子模块
当一个项目在开发若干时间后,希望将某个目录单独出一个项目来开发,此时就可以利用这个subtree的功能分离里。
具体的操作方式是这样的:(只能在Git Bash的命令行中操作)
1. 首先cd到需要处理的项目的根目录:
|
1 2 3 4 5 |
$ pushd ./ $ git subtree split -P <name-of-folder> -b <name-of-new-branch> # 将需要分离的目录的提交日志分离成一个独立的临时版本 $ popd |
注意
<name-of-folder> 必须是从工程的根目录开始算起,类似“project/hello/world”的格式。
<name-of-new-branch> 的名字,尽量取简单。
2. 创建一个新的repo(项目)(离开原有的项目的文件夹,在另外的地方新建一个项目)
|
1 2 3 4 5 6 7 |
$ mkdir <new-repo> $ pushd <new-repo> $ git init $ git pull </path/to/big-repo> <name-of-new-branch> |
注意
</path/to/big-repo>是我们需要拉取数据的根目录的绝对路径,类似 “D:\Source\Project”的格式。
<name-of-new-branch> 是我们刚刚分离出来的分支的名字。
3. 添加子模块(到原来工程的根目录下面)
|
1 |
$ git submodule add git@github.com:my-user/new-repo.git <name-of-folder> |
可以看到,在原来的Git工程的根目录下面增加了一个名为“.gitmodules”的文件,里面的内容如下:
|
1 2 3 |
[submodule "<name-of-folder>"] path = <name-of-folder> url = git@github.com:my-user/new-repo.git |
fatal error C1189: #error : The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden macro.
最近在使用 VS2015 编译以前用VS2008的项目的时候,提示错误:fatal error C1189: #error : The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden macro.
解决方法:在项目的“预处理器定义”中增加 "_XKEYCHECK_H"
如何在Android Studio中更新jar包
Linux计算MD5和Sha1的命令
MD5
MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。
Sha1
安全散列算法(英语:Secure Hash Algorithm)是一种能计算出一个数位讯息所对应到的,长度固定的字串(又称讯息摘要)的算法。且若输入的讯息不同,它们对应到不同字串的机率很高;而SHA是FIPS所认证的五种安全散列算法。这些算法之所以称作“安全”是基于以下两点(根据官方标准的描述):“1)由讯息摘要反推原输入讯息,从计算理论上来说是很困难的。2)想要找到两组不同的讯息对应到相同的讯息摘要,从计算理论上来说也是很困难的。任何对输入讯息的变动,都有很高的机率导致其产生的讯息摘要迥异。
MD5 与 SHA1 是当前最常用的两种哈希算法。那在Linux下如何计算这两种哈希值呢,基本上所有的 Linux 发行版都内置了这两个命令,比如要校检的文件命为OurUnix.tar:
计算文件的 MD5 – md5sum
|
1 2 |
$ md5sum OurUnix.tar b9555cc1915652237948e37ccc9c484e OurUnix.tar |
计算文件的 SHA1 – sha1sum
|
1 2 |
$sha1sum OurUnix.tar bb7d67fb5776c2854edf35ec4a585ff8adc3dbda OurUnix.tar |



