最近升级使用trixie 遇到了一个问题,希望能解惑。

在使用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 命令是可以的。
现在就是不清楚,问题出在哪里,应该如何去排查。

你可以使用 ltracestrace 检查库函数调用和系统调用的结果,也可以从源码进行调试:

https://packages.debian.org/source/trixie/libime

看上去这个程序很简短。

如何使用 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

@CatEricka 非常感谢,耽误您时间了,您给的解决思路,之后我也会了解去学习。
是我这里出了问题,文件名称拼写错了。应该是找不到此文件,导致出现这个问题。
只是终端不会提示“找不到文件”这类的话术。
再次感谢。

我注意到 libime_tabledict.cpp 没有进行任何错误检查,包括检查输入和输出文件是否存在,而是直接打开文件并写入,所以当文件不存在时 iostream 会抛异常,调用 abort() 结束进程。

至于为什么 zsh 显示 zsh: IOT instruction,这里有一个简短的解释:

当然,如果您有兴趣,可以向上游贡献代码,增加错误检查,或者打开一个 issue:

我刚也看了源代码,确实没有任何的文件类提示,也可能使用这功能的人员少吧,作者可能为了省时,能用就行这么考虑的。