C, C++, Obj-C

又是wchar_t的问题,这次是Apple LLVM compiler 3.0的bug!

之前发现过Android上NDK对wchar_t以及相关函数的支持不足问题,后来又发现过iOS上类似的setlocale问题。最近在更新了Xcode 4.2以后,发现之前用的wchar_t相关的东西都不对了,wcslen函数返回的字符串长度不对,而且在gdb中用p查看const wchar_t*变量时,显示的是const void*,貌似就没有wchar_t相关的东西。

这个问题如果切换编译器为之前的LLVM GCC编译器则一切正常,浪费了很多时间排查错误,最后发现更新了最近的Xcode 4.3(4E109)带的Apple LLVM compiler 3.1就没问题了。啊!原来是3.0的BUG。

MotoDroid的glTexSubImage2D作用贴图尺寸问题

之前用MotoDroid机器的时候曾经发现过一个比较恶心的事,就是glGenTextures函数生成的贴图ID是乱数的问题,后来发现GL官方也说不保证此函数返回值是连续正整数,也就罢了。这次又发现MotoDroid上的glTexSubImage2D函数问题,就是在获取gl信息中的最大贴图尺寸时,ME525和Milestone2都返回2048×2048(其它机型未测),但在贴图尺寸为2048×2048的时候调用glTexSubImage2Dj局部更新贴图时,会出现错误覆盖贴图已有内容的问题,而将贴图尺寸降为1024×1024后就不会出现这种问题了。

iOS系统swprintf格式化带中文字符参数串的EILSEQ问题

之前在Android NDK下纠结过wchar的问题,发现在官方文档里写着2.3以上系统支持部分wchar相关函数,如wcslen等,不支持swprintf,mbstowcs等,很是遗憾,只能自己找了相关函数的源码作了替代实现。现在居然发现在iOS上用swprintf效果也是不尽人意。

省略若干google baidu以及排查调试的过程,直接讲结果,就是在用swprintf的时候任何参数串内容带有中文字符(应该是所有非ansi那些),就会导致返回错误-1,查看errno错误号是EILSEQ,原因就是wchar串里有无法解析的编码字符,这个问题的解决方法是:

Continue reading…

Android真机执行ndk-gdb后出现”found running pid:0 could not extract pid of application…”的解决方法

先说出这问题时的周遭环境:

Android SDK Tools r12
Android SDK Platform-tools r6
Android NDK r6
HTC G10 DesireHD(root)
Eclipse 3.7 Indigo
ADT 12.0.0
Windows XP SP3

问题描述:按着Sequoyah Native Debug的教程走,到执行ndk-gdb起服务的时候,提示”found running pid:0 could not extract pid of application…”说找不到程序的PID(顺带一提,之前还有一次是提示could not extract package’s data directory…,经查发现原因应该是设备没有root),执行adb shell ps发现要调试程序的进程就在那里,PID也看到正常,为什么ndk-gdb说获取不到PID呢?

Continue reading…

NDK r6编译一直提示WARNING: Rebuilding STLport libraries from sources! 的不确定解决方法

自从升级到NDK r6以后,一执行编译就会提示这些东西:

Android NDK: WARNING: Rebuilding STLport libraries from sources!
Android NDK: You might want to use $NDK/build/tools/build-
stlport.sh
Android NDK: in order to build prebuilt versions to speed up your
builds!

说用到的STL port可以用它说的sh进行prebuilt来提高编译速度,虽然没发现有什么太大的影响,但每次提示都很烦人,尤其是ndk-gdb执行的时候居然也会有这些提示,于是决定想办法解决一下!

Continue reading…

XCode中cpp文件第一行出现Parse Issue: Expected unqualified-id错误的原因

移植Win32下的cpp文件到xcode中编译时发现,代码可以顺利通过编译,但在xcode中一查看cpp文件就会出现标题中的那个错误,虽然不影响编译运行程序,但是所有的h中的关键字都不能高亮且会导致一些关联的语法错误,起初以为是header search path的问题,但排查一通后发现问题原来是出在源文件的编码方式上!

xcode默认是使用UTF-8作为源代码文本文件的字符编码的,曾经为了统一这个,Win32下的cpp也改为了UTF-8,但是windows下的UTF-8文本文件头中会加入几个字节的编码标示,比如UTF-8是EF BB BF,UTF-16也有,是什么记不清了,是2个byte的。

导致xcode parse source时出错的就是这个字节标识,删掉就可以了。

deprecated conversion from string constant to char *

可能是xcode4用的gcc版本比较高的原因,在移植代码的时候出现了这样一个警告,正好提高了一下对const char*的认识。

void foo(char* szArg);

这样的函数这样 foo(“test”); 调用就会提示这个警告,以前可能没太注意过,因为传递的参数字符串是被作为常量处理的,而函数原型却要得不是const指针,也就是说函数内实现是允许修改指针内存的,所以编译器就爆了,理所应当的一个warning,改成const char*参数类型就可以了。

Your debugger is not using the correct symbols

今个用WinDBG研究IDT时突然出现!idt命令提示Your debugger is not using the correct symbols,不知何故,试了一些网上提到的解决方法,都不太好使,结果发现只要简单的.reload一下就可以了,真是莫名其妙。

The source file is different from when the module was built.

*******************************

Source file: D:\Projects\StereoMatch\stereomatcher.cpp

Module: D:\Projects\StereoMatch\Debug\StereoMatch.exe

Process: [4024] StereoMatch.exe

The source file is different from when the module was built. Would you like the debugger to use it anyway?

*******************************

***********************************

At StereoMatcher.cpp, line 166 (‘ComputeCorrespondence()’, line 128)

The breakpoint will not currently be hit. The source code is different from the original version.

Continue reading…