除非首先按下,否则NCurses会对wgetnstr进行段错误

时间:2015-01-29 21:55:04

标签: c++ segmentation-fault ncurses

我正在使用NCurses在文本输入上编写的应用程序中遇到一个奇怪的崩溃(SIGSEGV)。每当我尝试输入文本时,段错误就会一直发生 - 无论如何 - 我首先发送一个输入,此时一切都按预期工作。在这里有点亏,并希望有人可能知道如何解决它或至少是什么错误。

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

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

代码:

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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

事实证明,这个问题是100%无关的。每当我不得不重绘它时,我在窗口上使用了delwin。但是,这种重绘通常是由另一个线程打印出来的。使用wclear而不是delwin / newwin可以修复所有内容,因为当我不需要时,实际上不会重新绘制winp。无可否认,无论如何,首先这样做对我来说可能是愚蠢的。