LINUX.ORG.RU

SIGSEGV, предположительно glibc


0

1

Debian, сыпется моя прога при запуске. На винде не сыпется. говорят, что это связано с sse4, который мой Core i3 плохо ловит.

flags                : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm arat tpr_shadow vnmi flexpriority ept vpid

А gdb говорит вот что:

Program received signal SIGSEGV, Segmentation fault.
__strlen_sse42 () at ../sysdeps/x86_64/multiarch/strlen-sse4.S:32
32      ../sysdeps/x86_64/multiarch/strlen-sse4.S: No such file or directory.
        in ../sysdeps/x86_64/multiarch/strlen-sse4.S
(gdb) bt
#0  __strlen_sse42 () at ../sysdeps/x86_64/multiarch/strlen-sse4.S:32
#1  0x0000003004e41814 in XSetCommand (dpy=0x6784b0, w=56623106, argv=0x64f1e0, argc=5) 
      at ../../src/SetHints.c:217
#2  0x0000003004e465ab in XSetWMProperties (dpy=0x6784b0, w=56623106, windowName=0x0, iconName=0x0, 
      argv=0x64f1e0,  argc=5, sizeHints=0x7fffffffe090, wmHints=0x7fffffffe0e0, classHints=0x7fffffffe190) 
      at ../../src/WMProps.c:101
#3  0x00007ffff739fc05 in QWidgetPrivate::create_sys(unsigned long, bool, bool) ()
      from /usr/lib/libQtGui.so.4
#4  0x00007ffff7351302 in QWidget::create(unsigned long, bool, bool) () from /usr/lib/libQtGui.so.4
#5  0x00007ffff735bbba in QWidget::setVisible(bool) () from /usr/lib/libQtGui.so.4
#6  0x0000000000417450 in QWidget::show (this=0x654990) at /usr/include/qt4/QtGui/qwidget.h:487
#7  0x0000000000416889 in ml_qWidget_show (self=6637968) at ml_QPushButton.cpp:10
#8  0x00000000004278e4 in caml_c_call ()
#9  0x0000000000631758 in camlQPushButton__18 ()
#10 0x00000000004084ba in camlMain__entry ()
#11 0x00007ffff7fc7238 in ?? ()
#12 0x00007ffff7fc70c0 in ?? ()
#13 0x00007ffff7fc7288 in ?? ()
#14 0x00007ffff7fc72d0 in ?? ()
#15 0x0000000000631680 in camlQPushButton__10 ()
#16 0x0000000000407af9 in caml_program ()
#17 0x00000000000961ed in ?? ()
#18 0x000000000042793a in caml_start_program ()
#19 0x0000000000000000 in ?? ()
(gdb)
скопипастил отсюда. Здесь же либа и код, который падает в test/. Куда копать, подскажите.

P.S. кусок кода glibc. Хотя мне кто-то объяснял, что в дебиане нет glibc.....


попробуйте valgring-ом ее, ну и собирать с -Wall

Иногда сегфолты в сист.библиотеках связаны с некорректными пользовательскими переменными - напр передачей в какой нить printf некорректного пойнтера.

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

это означает что программа читает за пределами выделенной памяти... Ну и судя по трейсу, strlen падает, пытаясь прочитать недоступную память. Скорее всего строка не окончена нулевым символом?

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

я нашел кусок кода

тут, но теперь надо понять как дебажить это через gdb...

собственно код:

int
XSetCommand (
	Display *dpy,
	Window w,
	char **argv,
	int argc)
{
	register int i;
	register int nbytes;
	register char *buf, *bp;
	for (i = 0, nbytes = 0; i < argc; i++) {
		nbytes += safestrlen(argv[i]) + 1; // <--------------------- Проблема ТУТ
	}
	if ((bp = buf = Xmalloc((unsigned) nbytes))) {
	    /* copy arguments into single buffer */
	    for (i = 0; i < argc; i++) {
		if (argv[i]) {
		    (void) strcpy(bp, argv[i]);
		    bp += strlen(argv[i]) + 1;
		}
		else
		    *bp++ = '\0';
	    }
	    XChangeProperty (dpy, w, XA_WM_COMMAND, XA_STRING, 8,
			     PropModeReplace, (unsigned char *)buf, nbytes);
	    Xfree(buf);
	}
	return 1;
}
P.S. хотя strlen вроде не то же самое, что safestrlen.... Надо бы найти репозиторий с дебиановскими исходниками. А то deb-src c ftp://ftp.de.debian.org подключил, но исходников не установилось.... (

Kakadu ()
Ответ на: я нашел кусок кода от Kakadu

apt-get source <имя пакета> усосёт сырцы в текущую папку(каталог? директорию? не помню какой вариант лоровские задроты считают правильным).

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

не усосет, а скажет что-то типа You must put some 'source' URIs in your sources.list

Но на это уже пофиг, я выдрал исходники с сайта нужно версии, сделал autoconf+make и теперь я имею нужные soшки

Что дальше дать, я в ступоре. Может символическими ссылками прописать мои soшки? И как убедиться, что я не далал никаких оптимизаций при компиляции???

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

>Может символическими ссылками прописать мои soшки?
LD_PRELOAD ?

И как убедиться, что я не далал никаких оптимизаций при компиляции???

CFLAGS ?

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

до CFLAGS=-O0 я догадался...

а с либами всё непонятно пока. подменил libX11.a , libX11.so.6.3.0 и libX11-xcb.so.1.0.0 - пошли креши и не грузятся иксы. вернул старые взад - загрузились. А с LD_PRELOAD я не понимаю чем он в данном случае поможет, и поэтому не хочу возиться.... (

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

если тебе нужно подменить какую-то библиотеку своим аналогом для 1 приложения, то делать это надо через LD_PLELOAD

seed_stil ★★ ()

вроде всё понятно

итак

argv[0]=путь к моей программе

argv[1]=0x0

argv[2]=0x0

argv[3]=adress out of bounds

и ТАДАМ.....

argc=134653564

Имхо, это где-то бага в libX11, если вы подтвердите, то я зарепортю

P.S. это я про цикл

   for (i = 0, nbytes = 0; i < argc; i++) {
      nbytes += safestrlen(argv[i]) + 1; 
   }

Kakadu ()
Ответ на: я нашел кусок кода от Kakadu

nbytes += safestrlen(argv) + 1; // <--------------------- Проблема ТУТ

Проблема не тут, а там, где неправильный argc в эту функцию передаётся.

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

да нехай семи разберутся --- оно это их, или не оно.

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