LINUX.ORG.RU

segfault в backtrace

 


0

3

В общем случилась беда. В программе отслеживаю падение и делаю backtrace, но в некоторых случаях происходит второй segfault внутри вызова backtrace. Как так получается?

Вызываю tracesize = backtrace(trace, 128);


Ответ на: "talk is cheap. show me the code"(с) от Deleted
	sigact.sa_flags = SA_SIGINFO;
	sigact.sa_sigaction = _Server_Error;

	sigemptyset(&sigact.sa_mask);

	sigaction(SIGFPE, &sigact, 0);
	sigaction(SIGILL, &sigact, 0);
	sigaction(SIGSEGV, &sigact, 0);
	sigaction(SIGBUS, &sigact, 0);
	sigaction(SIGABRT, &sigact, 0);


void _Server_Error(int Sig, siginfo_t *Si, void *Ptr)
{
	void*	ErrorAddr;
	void*	Trace[128];
	int	x;
	int	TraceSize;
	char**	Messages;


#if __WORDSIZE == 64
#ifdef linux
	ErrorAddr = (void*)((ucontext_t*)Ptr)->uc_mcontext.gregs[REG_RIP];
#else
#error Not Support OS
#endif
#else
#ifdef linux
	ErrorAddr = (void*)((ucontext_t*)Ptr)->uc_mcontext.gregs[REG_EIP];
#else
#error Not Support OS
#endif
#endif
	Log_Write(1, "[SERVER] Signal: %s Addr: %p EIP: %p\n", strsignal(Sig), Si->si_addr, ErrorAddr);

	TraceSize = backtrace(Trace, 128);
	Messages = backtrace_symbols(Trace, TraceSize);

	if (Messages)
	{
		Log_Write(0, "== Backtrace ==\n");
		for (x = 1; x < TraceSize; x++)
		{
			Log_Write(0, "%s\n", Messages[x]);
		}
		Log_Write(0, "== End Backtrace ==\n");
		free(Messages);
	}

	Log_Write(1, "[SERVER] Stopped\n");
	exit(RET_CODE_SIGNAL_ERROR);
}

Сама ошибка эмулируется где-то далеко в коде, через вызов функции по нулевому адрес.

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

gdb вот что показывает во время второй ошибки

#0  0x00007ffff71e9730 in ?? () from /lib/x86_64-linux-gnu/libgcc_s.so.1
#1  0x00007ffff71ea3bc in _Unwind_Backtrace () from /lib/x86_64-linux-gnu/libgcc_s.so.1
#2  0x00007ffff6f3f24e in backtrace () from /lib/x86_64-linux-gnu/libc.so.6
#3  0x0000000000409087 in _Server_Error (Sig=11, Si=0x7ffff6c45930, Ptr=0x7ffff6c45800) at server.c:36
#4  <signal handler called>
********

slesh
() автор топика

Получается просто — программа испортила сохраненный на стеке rbp, и поэтому backtrace полез в запрещённую память.

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