LINUX.ORG.RU

Сообщения piroflip

 

Отладка приложения с большим количеством процессов (fork)

Есть приложение, которое работает на 24-х ядерной системе и создает 24 процесса соответственно, привязывая каждый к своему собственному ЦПУ. В какой-то момент, под большой нагрузкой, программа вылетает в SIGSEGV, кто-то перетер кусок памяти расшаренной между процессами (shmget, shmat). На меньшем количестве процессов проявить не удается. Как можно запустить это под gdb, с установкой watches по адресу и посмотреть кто это портит память? Приаттачится ко всем child и делать watch? Или можно элегантнее?

piroflip
()

Оптимизатор GCC 4.4

Какой-то он странный стал, дурит.

Есть простой кусок кода, знаю так немного криво делать, но ничего плохого в этом нет, правда ведь? )))

#include <stddef.h>

#pragma pack(1)

typedef struct _footype {
  char          bar1[8];
  void*         bar2;
} footype;


footype *foo() {
  footype *dummy;

  dummy=(footype*)findbar();
  *((unsigned long*)&dummy)-=offsetof(footype,bar2);
  return dummy;
}
Компилирую gcc 4.4.0

$ gcc -c -S -O1 gcc.c получаю такой листинг

	.file	"gcc.c"
	.text
.globl foo
	.type	foo, @function
foo:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$24, %esp
	call	findbar
	subl	$8, %eax   <== получаем указатель на footype
	leave
	ret
	.size	foo, .-foo
	.ident	"GCC: (GNU) 4.4.0 20090526 (prerelease)"
	.section	.note.GNU-stack,"",@progbits

с оптимизацией O2

$ gcc -c -S -O2 gcc.c

	.file	"gcc.c"
	.text
	.p2align 4,,15
.globl foo
	.type	foo, @function
foo:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$24, %esp
	call	findbar
                          <===== где sub $8, б&я?
	leave
	ret
	.size	foo, .-foo
	.ident	"GCC: (GNU) 4.4.0 20090526 (prerelease)"
	.section	.note.GNU-stack,"",@progbits

Тот же код на 4.3.2 дает хоть и кривее листинг, но он корректен.

-O1

	.file	"gcc.c"
	.text
.globl foo
	.type	foo, @function
foo:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$24, %esp
	call	findbar
	movl	%eax, -4(%ebp)
	subl	$8, -4(%ebp)
	movl	-4(%ebp), %eax
	leave
	ret
	.size	foo, .-foo
	.ident	"GCC: (GNU) 4.3.2"
	.section	.note.GNU-stack,"",@progbits

-O2

	.file	"gcc.c"
	.text
.globl foo
	.type	foo, @function
foo:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$24, %esp
	call	findbar
	movl	%eax, -4(%ebp)
	subl	$8, -4(%ebp)
	leave
	ret
	.size	foo, .-foo
	.ident	"GCC: (GNU) 4.3.2"
	.section	.note.GNU-stack,"",@progbits

т.е. прямо по стеку фигачит и возвращает значение.

Естественно в этом месте я код поправил, но хотелось бы знать почему гцц приподнес мне такую жопу? И что от него еще ждать. Одну ошибку я так и не могу найти ((( при использовании 4.3.2 все ОК.

piroflip
()

ioctl внутри ядра

Как правильно вызвать ioctl внутри ядра? Конкретно интересует вызов "Device mapper IOCTLs". Никакого другого интерфейса кроме ioctl эта подсистема не предполагает.

>>>

piroflip
()

RSS подписка на новые темы