use*_*210 5 c++ linux debugging unicode gdb
我作为C++ Developer使用MS Visual Studio作为工作平台已经工作了几年.由于我私下更喜欢使用linux,我最近也抓住机会将我的工作环境转移到linux.由于我几年来一直在优化我的Windows环境,当然事实证明有些东西缺失或没有按预期工作.因此,我有一些问题,我还没有得到有用的答案.
让我们开始以下问题,以后可能会有不同的问题.每当我被迫在非Windows平台上调试平台特定的错误时,我已经多次偶然发现了这个问题.
简单来说:如何在linux上调试时显示Unicode(UCS2编码)字符串?
现在我已经想到了一些细节.我们的Lib使用一个基于Unicode的String类,它将每个char编码为16位Unicode值(但我们不支持多字编码,因此我们基本上只能使用UTF16的UCS2可编码子集,但这包括几乎所有使用过的脚本) .这已经造成一个问题,因为大多数平台(即linux/unix)认为
wchar_t
类型由4个字节组成,而在Windows上它只有2个字节,因此我不能简单地将内部字符串缓冲区转换为(wchar_t *
),所以我不确定,如果这真的有助于任何调试器.
对于gdb我已经想过,我可以从调试代码中调用函数来打印调试消息.因此,我在lib中插入了一个特殊函数,可以任意转换字符串数据并将其写入新缓冲区.目前我将我们的内部缓冲区转码为utf8,因为我希望这可能最有效.
但到目前为止,这只能部分地解决问题:如果字符串是拉丁语,那么我现在得到一个可读输出(如果它是16位编码,则不能直接打印拉丁数据),但我还必须处理其他脚本( FE CJK(又名汉斯/汉字),西里尔,希腊...)和与涉及我的意思是使用这样的脚本,由于使用的脚本直接影响控制流必须具体调试数据.Ofcourse在这些情况下,我只能看到对应多个字节组成一个UTF8字符,这使得调试CJK数据更加隐蔽,然后正确显示的字符串将是ISO字符.
通常gdb允许设置多个主机和目标编码,因此应该可以将正确的编码utf8数据流发送到控制台.
但我当然更喜欢使用IDE进行调试.目前我正在尝试与eclipse和CDT交朋友,但为了调试我还测试了kdgb.在这两个应用程序中,我到目前为止只能获得错误解码的utf8数据.另一方面,我曾经在Windows平台上调试eclipse中的java项目并且所有内部字符串都正确显示(但是这个应用程序没有使用我们的lib和相应的字符串),因此至少在某些情况下eclipse可以正确显示unicode字符.
对我来说最烦人的一点是,到目前为止我甚至无法提出任何证据,显示真正的unicode数据(即非ISO字符)在linux上的任何设置中都有效(即使是我发现的QStrings的gdb脚本) ,似乎只显示拉丁字符并跳过其余部分),但当然几乎每个linux应用程序似乎都支持unicode数据,因此必须有人,在linux平台上调试真正的unicode数据,我真的无法想象,他们是所有读取十六进制代码而不是直接显示unicode字符串.
因此,也可以理解任何指向允许基于任何其他字符串类(fe QString)和/或IDE调试unicode字符串的设置的指针.
我假设你在 X 之下?是否安装了正确的字体?
如果在控制台上,您是否使用帧缓冲区作为终端设备?VGA 文本模式最多只能显示 256/512 个字符。(512 案例 iirc 占用了一点色彩空间)