我正在使用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
提前感谢您的帮助。
答案 0 :(得分:0)
事实证明,这个问题是100%无关的。每当我不得不重绘它时,我在窗口上使用了delwin。但是,这种重绘通常是由另一个线程打印出来的。使用wclear而不是delwin / newwin可以修复所有内容,因为当我不需要时,实际上不会重新绘制winp。无可否认,无论如何,首先这样做对我来说可能是愚蠢的。