LINUX.ORG.RU

Dialog core dump

 ,


0

2

Падает где-то в недрах libncursesw. Ось бубунта 12.10. Пример взят из докуметации dialog. Вариант с пустым msgbox вставил в процессе экспериментов. Программа не падает, если запускать с tty1. Но благополучно падает, если в диалоге вместо enter нажать стрелку курсора.

#include <math.h>
#include <dialog.h>

int main(void) {
    int status;
    init_dialog(stdin, stdout);
    /*status = dialog_yesno("Hello, in dialog-format", "Hello World!", 0, 0);*/
    status = dialog_msgbox("", "", 0, 0, 1);
    end_dialog();
    return status;
}
CC       = gcc
CFLAGS   = -W -Wall -Wextra -pedantic -g -fomit-frame-pointer
LDLIBS   = -ldialog -lncurses -lncursesw -lm
RM       = rm -f

build : linstall.o
	$(CC) $(CFLAGS) -o linstall linstall.o $(LDLIBS)

linstall.o : linstall.c
	$(CC) $(CFLAGS) -c linstall.c

clean :
	$(RM) *.o

dist-clean: clean
	$(RM) linstall

P.S.: я догадался поставить debugging symbols. Вот что пишет:

Program received signal SIGSEGV, Segmentation fault.
cannot_delete (win=...) at /build/buildd/ncurses-5.9/ncurses/base/lib_delwin.c:59
59    /build/buildd/ncurses-5.9/ncurses/base/lib_delwin.c: No such file or directory.

Ответ на: комментарий от MKuznetsov

Не нужно.

Но я попробовал вставить. Ничего не изменилось.

Gregon ()
Ответ на: комментарий от Sectoid

Нагуглил. Сделал как описано в вики бубунты.

GNU gdb (GDB) 7.5-ubuntu
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /media/gregon/daten2/Soft/SmileyX/linstall/linstall...done.
(gdb) handle SIG33 pass nostop noprint
Signal        Stop	Print	Pass to program	Description
SIG33         No	No	Yes		Real-time event 33
(gdb) set pagination 0
(gdb) run
Starting program: /media/gregon/daten2/Soft/SmileyX/linstall/linstall 

Program received signal SIGSEGV, Segmentation fault.
cannot_delete (win=0x808f9e0) at /build/buildd/ncurses-5.9/ncurses/base/lib_delwin.c:59
59	/build/buildd/ncurses-5.9/ncurses/base/lib_delwin.c: No such file or directory.
(gdb) backtrace full
#0  cannot_delete (win=0x808f9e0) at /build/buildd/ncurses-5.9/ncurses/base/lib_delwin.c:59
        p = 0x60056c
        result = <optimised out>
#1  delwin (win=0x808f9e0) at /build/buildd/ncurses-5.9/ncurses/base/lib_delwin.c:77
        result = -1
#2  0x0804dc00 in dlg_del_window ()
No symbol table info available.
#3  0x0804a348 in dialog_msgbox ()
No symbol table info available.
#4  0x08049fa8 in main () at linstall.c:8
        status = -1208889344
(gdb) info registers
eax            0x60056c	6292844
ecx            0x0	0
edx            0x600574	6292852
ebx            0xb7fbf000	-1208225792
esp            0xbffff040	0xbffff040
ebp            0x808f9c8	0x808f9c8
esi            0x808f9e0	134805984
edi            0x808f9c8	134805960
eip            0xb7fa6758	0xb7fa6758 <delwin+56>
eflags         0x210216	[ PF AF IF RF ID ]
cs             0x73	115
ss             0x7b	123
ds             0x7b	123
es             0x7b	123
fs             0x0	0
gs             0x33	51
(gdb) x/16i $pc
=> 0xb7fa6758 <delwin+56>:	testb  $0x1,0x14(%eax)
   0xb7fa675c <delwin+60>:	je     0xb7fa6767 <delwin+71>
   0xb7fa675e <delwin+62>:	cmp    0x40(%eax),%esi
   0xb7fa6761 <delwin+65>:	je     0xb7fa6800 <delwin+224>
   0xb7fa6767 <delwin+71>:	mov    (%eax),%eax
   0xb7fa6769 <delwin+73>:	test   %eax,%eax
   0xb7fa676b <delwin+75>:	je     0xb7fa6780 <delwin+96>
   0xb7fa676d <delwin+77>:	lea    0x8(%eax),%edx
   0xb7fa6770 <delwin+80>:	cmp    %edx,%esi
   0xb7fa6772 <delwin+82>:	jne    0xb7fa6758 <delwin+56>
   0xb7fa6774 <delwin+84>:	mov    (%eax),%eax
   0xb7fa6776 <delwin+86>:	xor    %ecx,%ecx
   0xb7fa6778 <delwin+88>:	test   %eax,%eax
   0xb7fa677a <delwin+90>:	jne    0xb7fa676d <delwin+77>
   0xb7fa677c <delwin+92>:	lea    0x0(%esi,%eiz,1),%esi
   0xb7fa6780 <delwin+96>:	test   %cl,%cl
(gdb) thread apply all backtrace

Thread 1 (process 11499):
#0  cannot_delete (win=0x808f9e0) at /build/buildd/ncurses-5.9/ncurses/base/lib_delwin.c:59
#1  delwin (win=0x808f9e0) at /build/buildd/ncurses-5.9/ncurses/base/lib_delwin.c:77
#2  0x0804dc00 in dlg_del_window ()
#3  0x0804a348 in dialog_msgbox ()
#4  0x08049fa8 in main () at linstall.c:8
(gdb) q
A debugging session is active.

	Inferior 1 [process 11499] will be killed.

Quit anyway? (y or n) 
Gregon ()

гента, умвр. Попробуй переустановить либы, например.

Deleted ()
Ответ на: комментарий от Gregon

давно не брал я в руки шашек, то есть не писал с ncurses..

но для начала уберите ncursesw из библиотек и все сообщения пусть будут по английски.

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

Где там хоть что-то не по английски?

Если убрать libncursesw, то оно отказывается собираться:

gcc -W -Wall -Wextra -pedantic -g -fomit-frame-pointer -o linstall linstall.o -ldialog -lncurses -lm
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libdialog.a(util.o): In function `repaint_cell':
(.text+0x34c): undefined reference to `win_wch'
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libdialog.a(util.o): In function `repaint_cell':
(.text+0x4ab): undefined reference to `getcchar'
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libdialog.a(trace.o): In function `dlg_trace_win':
(.text+0x233): undefined reference to `win_wch'
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libdialog.a(trace.o): In function `dlg_trace_win':
(.text+0x244): undefined reference to `wunctrl'
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libdialog.a(arrows.o): In function `dlg_draw_arrows2':
(.text+0x330): undefined reference to `_nc_wacs'
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libdialog.a(arrows.o): In function `dlg_draw_arrows2':
(.text+0x343): undefined reference to `wadd_wch'
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libdialog.a(arrows.o): In function `dlg_draw_arrows2':
(.text+0x3e9): undefined reference to `_nc_wacs'
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libdialog.a(arrows.o): In function `dlg_draw_arrows2':
(.text+0x3fc): undefined reference to `wadd_wch'
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libdialog.a(inputstr.o): In function `dlg_index_columns':
(.text+0xaec): undefined reference to `setcchar'
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libdialog.a(inputstr.o): In function `dlg_index_columns':
(.text+0xaf4): undefined reference to `wunctrl'
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libdialog.a(ui_getc.o): In function `dlg_getc':
(.text+0x5d2): undefined reference to `wget_wch'
collect2: error: ld returned 1 exit status
make: *** [build] Error 1
Gregon ()
Ответ на: комментарий от Gregon

значит в зависимоcтях libdialog - libncursesw, оставляйте его, а 7(8?)-ми битный вариант вычёркивайте..

та что с буковкой w - это вариант с поддержкой wide символов. И в любом случае все тексты, должны быть исключительно по английски, или предварительно конвертиться в wide-формат.

MKuznetsov ★★★★★ ()
Ответ на: комментарий от Gregon

краткий экскурс по семплам ncurses, говорит что необходимо

  • #define _XOPEN_SOURCE_EXTENDED до всех include, незнаю зачем, но там так принято :)
  • setlocale(LC_ALL, ""); что логично, иначе библиотеке неясно в какой кодировке строки и сколько байт в символе.
MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

Дело в том, что насколько я понял, dialog в теории должен сам рулить ncurses и скрывать от пользователя детали. Походу официальным мануалом от разработчика можно подтереться:

http://invisible-island.net/dialog/manpage/dialog_lib.txt

Gregon ()
Ответ на: комментарий от Gregon

Это вообще нормально, что оно компилируется без ошибок с лишним флагом?

а вот да :-) это-ж не флаг - это всёго-таки библиотека. Вы можете перечислить хоть все которые есть в системе :-)

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

Я не понял сам механизм, почему оно ломается. dialog инклюдит хидеры ncursesw. А у ncurses получается, хидеры точно так же называются? Фигня какая-то выходит:

-lncurses не собирается

-lncurses -lncursesw собирается, но ломается

-lncursesw все работает

Gregon ()
Ответ на: комментарий от Gregon

-lncurses -lncursesw собирается, но ломается

если поменять местами, то тоже должно перестать ломаться

в разных вариантах библиотеки есть одноимённые символы(функции), зацепится та, которая первая. В твоём случае получается, что неправильная

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

Вы можете перечислить хоть все которые есть в системе

Они могут конфликтовать :(. Я ещё встречал чудеса с порядком их перечисления: если две либы поменять местами то не работало. Название софтины, увы, не помню.

true_admin ★★★★★ ()
Ответ на: комментарий от Gregon

-lncurses -lncursesw

Я думаю, так делать нельзя. Возможно, они обе подцепляются и происходит конфликт.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Я точно помню, что один из хитрых флагов gcc для создания shared lib нужно всегда пихать в самый конец.

Не нравится мне все это.

Gregon ()
Ответ на: комментарий от MKuznetsov

Ха, вы совершенно правы, с обратным порядком работает. Но так делать действительно не стоит. Жаль, разработчик не написал этого в документации.

Gregon ()
Ответ на: комментарий от true_admin

Статья хорошая, сохранил.

Я потому и взял dialog, чтобы напрямую с ncurses не связываться)) Других вариантов считай нету. Есть еще whiptail который базируется на newt который базируется на s-lang или типа того. Еще есть stfl, но это тот же dialog, только в профиль.

Gregon ()
Ответ на: комментарий от true_admin

Там какие-то ужасы написаны, не всё так плохо.

  • 1-3 пункты к ncurses отношения не имеют и вовсе.
  • 4 пункт - проблема мейнтейнера пакетов.
  • 5 (setlocale()) - не является специфичным для ncurses, а требуется стандартной библиотекой C.
  • 6 - отсутствие _XOPEN_SOURCE_EXTENDED вроде не даёт всего-лишь пару функций (например, wcwidth()).
  • 7-8 относятся к работе с любой библиотекой, понятное дело, что надо использовать правильные -I и -l флаги.

В общем, не конструктивная какая-то заметка, которая ИМО не отражает реальное положение дел. Больше похоже на то, что у её автора просто было мало опыта использования сторонних библиотек.

xaizek ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.