#c #gcc #codeblocks #ncurses
Вопрос:
Я столкнулся с проблемой, когда пытался отладить консольный проект c в кодовых блоках
Отладка шла нормально, пока я не включил lt;ncurses.hgt; и не включил библиотеку с-lncurses
Я взял образец кода с другой страницы stackoverflow, если кто-то захочет попробовать. Этот пример кода компилируется и работает нормально, но когда я пытаюсь его отладить, он закрывает окно консоли при выполнении строки: w = initscr();
#include lt;stdlib.hgt; #include lt;curses.hgt; //#include lt;locale.hgt; #include lt;ctype.hgt; #include lt;unistd.hgt; int main( void ) { WINDOW *w; int c; /* This is optional. This tells the C libraries to use user's locale settings. */ // setlocale( LC_ALL, "" ); /* Initialize curses. */ w = initscr(); if ( w == NULL ) { fprintf( stderr, "Error initializing curses library.n" ); return EXIT_FAILURE; } raw(); /* Terminal in raw mode, no buffering */ noecho(); /* Disable echoing */ //nonl(); /* Disable newline/return mapping */ keypad( w, FALSE ); /* FALSE: CSI codes, TRUE: curses codes for keys */ timeout(1); printw( "Press Q to quit.n" ); do { c = getch(); if ( isprint( c ) ) { printw( " Received character '%c' ", c ); } usleep( 100000 ); printw( "." ); } while ( c != 'Q' ); /* Done. */ endwin(); return EXIT_SUCCESS; }
Журнал сборки выглядит для меня нормально:
-------------- Clean: Debug in keyboard (compiler: GNU GCC Compiler)--------------- Cleaned "keyboard - Debug" -------------- Build: Debug in keyboard (compiler: GNU GCC Compiler)--------------- g -Wall -fexceptions -g -I/usr/lib/x86_64-linux-gnu/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -DCB_VERSION="\"Code::Blocks Release 20.03 rev 11997 2020-04-18, 19:47:24\"" -I/usr/include -c /home/data/VBOX/VBOX_DATA/CodeBlocks/keyboard/main.cpp -o obj/Debug/main.o g -L/usr/lib/ -o bin/Debug/keyboard obj/Debug/main.o -L/usr/lib/x86_64-linux-gnu -pthread -lwx_gtk3u_xrc-3.0 -lwx_gtk3u_html-3.0 -lwx_gtk3u_qa-3.0 -lwx_gtk3u_adv-3.0 -lwx_gtk3u_core-3.0 -lwx_baseu_xml-3.0 -lwx_baseu_net-3.0 -lwx_baseu-3.0 -lncurses Output file is bin/Debug/keyboard with size 23.88 KB Process terminated with status 0 (0 minute(s), 0 second(s)) 0 error(s), 0 warning(s) (0 minute(s), 0 second(s))
Последние строки из окна отладчика:
Debugger name and version: GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2 [debug]gt;gt;gt;gt;gt;gt;cb_gdb: [debug]gt; set width 0 [debug]gt;gt;gt;gt;gt;gt;cb_gdb: [debug]gt; set height 0 [debug]gt;gt;gt;gt;gt;gt;cb_gdb: [debug]gt; set breakpoint pending on [debug]gt;gt;gt;gt;gt;gt;cb_gdb: [debug]gt; set print asm-demangle on [debug]gt;gt;gt;gt;gt;gt;cb_gdb: [debug]gt; set unwindonsignal on [debug]gt;gt;gt;gt;gt;gt;cb_gdb: [debug]gt; set print elements 200 [debug]gt;gt;gt;gt;gt;gt;cb_gdb: [debug]gt; set disassembly-flavor intel [debug]gt;gt;gt;gt;gt;gt;cb_gdb: [debug]gt; catch throw [debug]Catchpoint 1 (throw) [debug]gt;gt;gt;gt;gt;gt;cb_gdb: [debug]gt; directory /home/data/VBOX/VBOX_DATA/CodeBlocks/keyboard/ [debug]Source directories searched: /home/data/VBOX/VBOX_DATA/CodeBlocks/keyboard:$cdir:$cwd [debug]gt;gt;gt;gt;gt;gt;cb_gdb: [debug]gt; tty /dev/pts/0 [debug]gt;gt;gt;gt;gt;gt;cb_gdb: [debug]gt; run [debug]Starting program: /home/data/VBOX/VBOX_DATA/CodeBlocks/keyboard/bin/Debug/keyboard [debug][Thread debugging using libthread_db enabled] [debug]Using host libthread_db library "/usr/lib/x86_64-linux-gnu/libthread_db.so.1". [debug][Inferior 1 (process 20484) exited with code 01] [debug]gt;gt;gt;gt;gt;gt;cb_gdb: [Inferior 1 (process 20484) exited with code 01] [debug]gt; quit Debugger finished with status 0
Что здесь может быть не так?
Комментарии:
1. почему
tty /dev/pts/0
? Это псевдо-tty, который, возможно, уже используется. В любом случае, это не vty.2. Понятия не имею, для чего это используется, в настройках я указал xterm
3. Либо удалите его, либо установите его в значение tty запущенного xterm. Я бы просто удалил его, так как его остановка вызывает проблемы с другими tty, вернее, вы не можете.
4. Я не вижу никаких признаков аварии. Программа завершается с кодом выхода 1. Это не катастрофа.
5. Это потому
gdb
, что не может писать/dev/pts/0
, если он удалит это, это будет работать просто отлично.
Ответ №1:
Я заставил ncurses работать в отладчике после того, как я изменил права доступа устройства /dev/pts/1 с помощью: chmod 777 /dev/pts/1 (обратите внимание, что pts/0 уже использовался другим терминалом для изменения прав доступа)
Это подтверждение того, что проблема вызвана терминалом, но я не хочу, чтобы это была постоянная ситуация, поэтому я попытался вернуть ее в:
crw--w---- 1 hennep tty 136, 1 nov 26 11:05 1
Когда я выполняю «chmod 620 /dev/pts/1», он выглядит так же, но я все еще могу запускать отладчик без каких-либо проблем. Это может быть хорошей новостью, но что-то изменилось в правах доступа, и я не знаю, что я напутал: — (