Member 10852608 Ответов: 1

[C++] как написать простой отладчик


я хочу установить аппаратную точку останова для адреса в памяти без использования функции CreateProcess

Что я уже пробовал:

ps: этот код работает нормально
bool dwResult;
	STARTUPINFO sinfo;
	DEBUG_EVENT DebugEvent;
	


	memset(&sinfo, 0, sizeof(sinfo));
	dwResult = CreateProcess("MainWindow.exe", 0, 0, 0, false, DEBUG_PROCESS|DEBUG_ONLY_THIS_PROCESS, 0, 0, &sinfo, &pinfo);
	if (dwResult)
	{
		while (dwResult)
		{
			WaitForDebugEvent(&DebugEvent, INFINITE);
			DWORD EventCode = DebugEvent.dwDebugEventCode;
			DWORD ExceptionCode = DebugEvent.u.Exception.ExceptionRecord.ExceptionCode;
			switch (EventCode)
			{
			case EXIT_PROCESS_DEBUG_EVENT:
				{
					dwResult = false;
					continue;
				};
			case CREATE_PROCESS_DEBUG_EVENT:
				{
				HANDLE Thread = OpenThread(THREAD_ALL_ACCESS, false, DebugEvent.dwThreadId);
				SetHWBP(Thread, 0x00E5254C, HWBP_EXECUTE, HWBP_BYTE, 0);	// to sniff serial
						
					
					CloseHandle(Thread);
				};
				
			case EXCEPTION_DEBUG_EVENT:
				{
					if (EXCEPTION_SINGLE_STEP == ExceptionCode)
					{
						HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, false, DebugEvent.dwThreadId);
						if (hThread)
						{
							CONTEXT context = {CONTEXT_ALL|CONTEXT_DEBUG_REGISTERS|CONTEXT_CONTROL};
							if (GetThreadContext(hThread, &context))
							{
								if ((context.Dr6 & (1 << 0)))	
								{
									DoSomething(&context); //execute after doing the HWBP
									RemoveHWBP(hThread, 0);
								}
								
							};
							CloseHandle(hThread);
						};
					};
				};
			};
			dwResult = ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, DBG_CONTINUE);
		};
		CloseHandle(pinfo.hProcess);
		CloseHandle(pinfo.hThread);
	};
	//system("pause");
	return false;

Richard MacCutchan

Так в чем же вопрос?

Member 10852608

я хочу установить аппаратную точку останова для адреса в процессе без использования функции CreateProcess, потому что я не хочу запускать процесс из своего отладчика , я просто хочу получить к нему дескриптор и установить HWBP для адреса

Richard MacCutchan

У вас есть комментарий выше, который гласит: "этот код отлично работает" Однако если адрес, на который вы ссылаетесь, находится за пределами адресного пространства вашего приложения, он завершится ошибкой с незаконным исключением адреса.

Кроме того, я не могу найти никаких ссылок на функцию SetHWBP; где она определена?

Member 10852608

не беспокойтесь об адресе он статичен
к сожалению вот вам и весь источник

http://rgho.st/74Pp4SdMd

1 Ответов

Рейтинг:
2

Patrice T

Цитата:
как написать простой отладчик
Написать отладчик совсем не просто.
Цитата:
я хочу установить аппаратную точку останова для адреса в памяти
Современные ОС довольно сложны, и обработка памяти довольно сложна.
Я рекомендую использовать существующие отладчики, один из ваших IDE-это хорошее начало.

Обратите внимание, что отладка последовательной связи может подразумевать специальный инструмент для обеспечения того, чтобы сама отладка не изменяла связь.