nisk
(nisk)
1
在使用libime_tabledict 修改码表时,出现了一个zsh 提示。
❯ libime_tabledict -d wbpy.main.dict wbpy.main.txt
terminate called after throwing an instance of 'std::ios_base::failure[abi:cxx11]'
what(): io fail: iostream error
zsh: IOT instruction (core dumped) libime_tabledict -d wbpy.main.dict wbpy.main.txt
在切换为bash时,使用libime_tabledict 命令是可以的。
现在就是不清楚,问题出在哪里,应该如何去排查。
CatEricka
(Cat Ericka)
2
你可以使用 ltrace
和 strace
检查库函数调用和系统调用的结果,也可以从源码进行调试:
https://packages.debian.org/source/trixie/libime
看上去这个程序很简短。
CatEricka
(Cat Ericka)
3
如何使用 gdb 调试 Debian 软件包:
添加调试符号存储库:
deb http://deb.debian.org/debian-debug/ trixie-debug main
deb http://deb.debian.org/debian-debug/ trixie-proposed-updates-debug main
设置环境变量 DEBUGINFOD_URLS
,启用自动符号文件下载:
export DEBUGINFOD_URLS="https://debuginfod.debian.net"
然后使用 gdb 启动目标程序,进行调试。gdb 会在运行过程中自动下载调试符号文件到临时目录,注意互联网连接速度。
因为 Debian 构建系统的原因,源码没办法被 gdb 自动附加,如果你需要 gdb 中的源码对照,要手动指定源码路径,参考方法:
如果你需要更强大的调试器,推荐使用 rr-debugger
,它支持在调试的时候进行“时间旅行”。
相关链接:
https://wiki.debian.org/HowToGetABacktrace
https://wiki.debian.org/AutomaticDebugPackages
补充:
使用 apt source
下载源码默认会选择候选包而不是已安装包的源码(二者不一定相同,取决于你的软件源配置),推荐使用 pk4
工具:
https://manpages.debian.org/testing/pk4/pk4.1.en.html
nisk
(nisk)
4
@CatEricka 非常感谢,耽误您时间了,您给的解决思路,之后我也会了解去学习。
是我这里出了问题,文件名称拼写错了。应该是找不到此文件,导致出现这个问题。
只是终端不会提示“找不到文件”这类的话术。
再次感谢。
CatEricka
(Cat Ericka)
5
我注意到 libime_tabledict.cpp
没有进行任何错误检查,包括检查输入和输出文件是否存在,而是直接打开文件并写入,所以当文件不存在时 iostream 会抛异常,调用 abort()
结束进程。
至于为什么 zsh 显示 zsh: IOT instruction
,这里有一个简短的解释:
当然,如果您有兴趣,可以向上游贡献代码,增加错误检查,或者打开一个 issue:
nisk
(nisk)
6
我刚也看了源代码,确实没有任何的文件类提示,也可能使用这功能的人员少吧,作者可能为了省时,能用就行这么考虑的。