LINUX.ORG.RU

Сообщения piroflip

 

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

Форум — Development

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

piroflip
()

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

Форум — Development

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

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

#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 внутри ядра

Форум — Development

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

>>>

piroflip
()

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