使用 get_wch()

问题描述

我正在编写一个使用 ncurses-rs 板条箱的 shell 历史记录应用程序,我遇到了从历史记录中删除条目的问题 - 简单地说,它在没有本机 readline 绑定的情况下是可以撤消的。我的程序从管道中读取(例如:histroy | hstr-rs),这使得手动操作历史文件变得不可能。因此,我引入了另一个名为 rl-sys 的 [unmaintained] crate,对它做了一个小改动(将单个语句包装在一个不安全的块中),因为它不会编译。此更改使应用程序编译,但是,这也导致我的程序在启动时出现段错误。我伸手去拿 gdb 想看看发生了什么,这就是我能够找到的:

Program received signal SIGSEGV,Segmentation fault.
                                                    0x00007ffff7f47821 in doupdate_sp () from /lib/x86_64-linux-gnu/libncursesw.so.6
(gdb) bt
#0  0x00007ffff7f47821 in doupdate_sp () from /lib/x86_64-linux-gnu/libncursesw.so.6
#1  0x00007ffff7f37db8 in wrefresh () from /lib/x86_64-linux-gnu/libncursesw.so.6
#2  0x00007ffff7f307da in ?? () from /lib/x86_64-linux-gnu/libncursesw.so.6
#3  0x00007ffff7f49c64 in wget_wch () from /lib/x86_64-linux-gnu/libncursesw.so.6
#4  0x000055555561a604 in ncurses::get_wch ()
#5  0x00005555555935f6 in hstr_rs::main ()
#6  0x0000555555586c73 in std::sys_common::backtrace::__rust_begin_short_backtrace ()
#7  0x0000555555586c8c in std::rt::lang_start::{{closure}} ()
#8  0x0000555555631ae7 in core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once () at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/ops/function.rs:259
#9  std::panicking::try::do_call () at library/std/src/panicking.rs:381
#10 std::panicking::try () at library/std/src/panicking.rs:345
#11 std::panic::catch_unwind () at library/std/src/panic.rs:382
#12 std::rt::lang_start_internal () at library/std/src/rt.rs:51
#13 0x0000555555595cf2 in main ()
(gdb) 

显然,它在 get_wch() 上出现了段错误。为了确保这是问题的原因,我尝试使用普通的 getch() 并且段错误消失了。但是,我需要该函数的宽版本。

我曾与一些人交谈过,他们建议我放弃 ncurses-rs 板条箱,转而使用其他板条箱,因为 ncurses-rs “非常不安全”,尽管它的功能没有被标记为不安全。说起来容易做起来难。在放弃它并重写应用程序以使用更安全的替代方案之前,我想了解发生了什么,并在可能的情况下尝试解决问题,因为重写需要大量的时间投资,而我目前无法负担。

我仍然缺乏经验,但我获得的 Valgrind log 对我来说并不好看。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)