NCurses 在 wgetnstr 上出现段错误,除非先按 Enter 键

NCurses segfault on wgetnstr unless enter pressed first

本文关键字:Enter 错误 wgetnstr 段错误 NCurses      更新时间:2023-10-16

我在文本输入上使用NCurses编写的应用程序中遇到了奇怪的崩溃(SIGSEGV)。每当我尝试输入文本时,段错误都会持续发生 - 除非 - 我先发送输入,此时一切都按预期工作。在这里有点不知所措,希望有人可能对如何解决它或至少有什么问题有所了解。

当前使用 ncurses 5.9。(来自 Debian Wheezy apt 存储库,对应于在 Debian 源代码仓库中提交 983732ea2cf3ed288555ddfa4090ca7825901c40 在 http://anonscm.debian.org/cgit/collab-maint/ncurses.git/tree/?h=wheezy&id=983732ea2cf3ed288555ddfa4090ca7825901c40)

我可以根据需要发布代码的其他部分(包括整个控制台类和主函数)。

法典:

void Console::readinput() {
  char* input;
  if (!(input = (char*)calloc(1, 1024))) {
    exit(212);
  }
  int r = wgetnstr(winp, input, 1024);
  updatewinp();
  if (r == ERR) readout();
  else if (r == KEY_RESIZE) redrawall();
  else if (input == 0) return;
  else if (strlen(input) == 0) redrawall();
  else if (strcmp(input, "exit") == 0) running = false;
  else sendmsg(input);
  free(input);
}

回溯:

#0  0x00007ffff79a61cc in waddch_literal (ch=<optimized out>, win=0x7bb080) at /build/buildd-ncurses_5.9-10-amd64-5ex5DJ/ncurses-5.9/ncurses/base/lib_addch.c:384
#1  waddch_nosync (ch=<optimized out>, win=0x7bb080) at /build/buildd-ncurses_5.9-10-amd64-5ex5DJ/ncurses-5.9/ncurses/base/lib_addch.c:434
#2  waddch (win=win@entry=0x7bb080, ch=<optimized out>) at /build/buildd-ncurses_5.9-10-amd64-5ex5DJ/ncurses-5.9/ncurses/base/lib_addch.c:539
#3  0x00007ffff79ab261 in wgetnstr (win=0x7bb080, str=0x864cc1 "", maxlen=1024) at /build/buildd-ncurses_5.9-10-amd64-5ex5DJ/ncurses-5.9/ncurses/base/lib_getstr.c:151
#4  0x000000000049f8b8 in Console::readinput() () at /home/admin/entropy/src/server/Console/Console.cpp:147
#5  0x00000000004ebd22 in main () at /home/admin/entropy/src/server/Entropy/main.cpp:55

提前感谢您的任何帮助。

事实证明,这个问题是 100% 无关的。每当我不得不重新绘制它时,我都会在窗户上使用delwin。但是,此重绘通常是由另一个线程向其打印某些内容触发的。使用 wclear 而不是 delwin/newwin 可以修复所有问题,因为在我不需要时实际上并没有重绘 winp。诚然,无论如何,一开始这样做对我来说可能是愚蠢的。