如何让gdb可以调试内联汇编

软件和网站开发以及相关技术探讨
回复
tiankunmin
帖子: 38
注册时间: 2007-09-07 3:08

如何让gdb可以调试内联汇编

#1

帖子 tiankunmin » 2007-09-16 2:14

$gdb ./1
(gdb)b strtoint
(gdb)r
调试到strtoint时直接跳到了lb_exit或干脆就到结束的}号那里 调试不了那个函数的语句。
请问这个有法解决么?

代码: 全选

#include <stdio.h>
#include <string.h>

#ifndef	NMULTD
#define	NMULTD(n)(((n) << 10) - ((n) << 4) - ((n) << 3))
#endif
#ifndef	__max
#define	__max(a, b)((a) > (b) ? (a) : (b))
#endif

int	strtoint(char* a)
{
	asm
	(
		".intel_syntax noprefix\n"
		"push	ebx\n"
		"push	ecx\n"
		"push	edx\n"
		"mov	ebx, dword ptr [ebp + 8]\n"
		"xor	eax, eax\n"
		"xor	edx, edx\n"
		"movzx	ecx, byte ptr [ebx]\n"
		"cmp	ecx, '-'\n"
		"jne	lb_trytonumber\n"
		"inc	ebx\n"
		"or	edx, 0x01\n"
	"lb_trytonumber:\n"
		"movzx	ecx, byte ptr [ebx]\n"
		"test	ecx, ecx\n"
		"jz	lb_testflag\n"
		"sub	ecx, 0x30\n"
		"jl	lb_badformat\n"
		"cmp	ecx, 0x09\n"
		"jg	lb_badformat\n"
		"imul	eax, 0x0A\n"
		"jo	lb_badformat\n"
		"add	eax, ecx\n"
		"jo	lb_badformat\n"
		"inc	ebx\n"
		"jmp	lb_trytonumber\n"
	"lb_badformat:\n"
		"xor	eax, eax\n"
		"jmp	lb_exit\n"
	"lb_testflag:\n"
		"test	edx, edx\n"
		"jz	lb_exit\n"
		"neg	eax\n"
	"lb_exit:\n"
		"pop	edx\n"
		"pop	ecx\n"
		"pop	ebx\n"
		".att_syntax noprefix\n"
	);
}

int	main(int argc, char *argv[])
{
	char s[256];
	int	i;
	printf("hello linux!\r\nplease type a integer value:");
	fgets(s, 9, stdin);
	i = strlen(s) - 1;
	s[__max(0, i)] = 0;
	i = strtoint(s);
	printf("[%s * 1000 = %d]\r\n", s, NMULTD(i));
	return 0;
}
头像
laborer
帖子: 1016
注册时间: 2005-10-25 11:15
联系:

#2

帖子 laborer » 2007-09-16 4:15

hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser
回复