Win32 Application (VC\MFC) 控制台mini调试工具 mDebug 0.1

加密与解密 调试篇 动态调试技术 (四)-x64dbg/MDebug x64dbg是开源的调试器 支持 32位和64位。 阅读详情

看了一下非常方便,收藏.

用VC写WIN32程序,没有控制台输出查看参数确实很不方便,这个功能提供了创建windows窗口的同时,又调出DOS界面,方便调试参数.



http://www.cnblogs.com/mr-wid/archive/2013/04/10/3012365.html



//  就一个头文件 mdebug.h

HWND hConsole = (HWND)GetStdHandle( STD_OUTPUT_HANDLE ); // 这里需要做个强制转换...

//mdebug.h
#pragma once

//////////////////////////////////////////////////////////////////////////

#include <windows.h>
#include <conio.h>
#include <stdio.h>

//////////////////////////////////////////////////////////////////////////

void debugInit();		//初始化调试库
void debugFree();		//关闭调试

//输出类函数
void mPuts( char *szFormat, ... );		//基础数据类型格式化输出
void mPutsEx( char *szFormat, ... );	//增强型数据类型格式化输出

//检测类函数
BOOL matchString( const char *szSrc, char **szDest );		//串匹配


//////////////////////////////////////////////////////////////////////////

int printPOINT( POINT );				//输出一个点的坐标信息, 输出格式 (x, y)
int printRECT( RECT );					//输出一个矩形的坐标信息, 输出格式 (left=left, top=top, right=right, bottom=bottom)
int printSIZE( SIZE );					//输出一个尺寸的坐标信息, 输出格式 [cx=cx, cy=cy]
int printRGBQUAD( RGBQUAD );			//输出一组 RGB 值, 输出格式, (r=r, g=g, b=b)

//////////////////////////////////////////////////////////////////////////

void debugInit()
{
	AllocConsole();
}

void debugFree()
{
	FreeConsole();
}

//////////////////////////////////////////////////////////////////////////

//基础数据类型格式化输出
void mPuts( char *szFormat, ... )
{
	char szBuffer[10*1024] = {0};

	va_list pArgList;
	va_start( pArgList, szFormat );
	_vsnprintf( szBuffer, sizeof(szBuffer)/sizeof(char), szFormat, pArgList );
	va_end(pArgList);

	_cputs( szBuffer );
}

//增强数据类型输出
void mPutsEx( char *szFormat, ... )
{
	va_list pArgList;

	POINT		pt;
	RECT		rect;
	SIZE		size;
	RGBQUAD		rgb;

	HWND hConsole = GetStdHandle( STD_OUTPUT_HANDLE );
	SetConsoleTextAttribute( hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY );

	va_start( pArgList, szFormat );
	
	while( *szFormat )
	{
		switch( *szFormat )
		{
		case '%':
			{
				szFormat++;
				//////////////////////////////////////////////////////////////////////////

				//增强型数据类型输出
				if( matchString( "pt", &szFormat ) )			// %pt == POINT Structure
				{
					pt = va_arg( pArgList, POINT );
					printPOINT( pt );
				}
				
				//////////////////////////////////////////////////////////////////////////

				if( matchString( "rect", &szFormat ) )			// %rect == RECT Structure
				{
					rect = va_arg( pArgList, RECT );
					printRECT( rect );
				}
				
				//////////////////////////////////////////////////////////////////////////

				if( matchString( "size", &szFormat ) )			// %size == SIZE Structure
				{
					size = va_arg( pArgList, SIZE );
					printSIZE( size );
				}

				//////////////////////////////////////////////////////////////////////////

				if( matchString( "rgb", &szFormat ) )			// %rgb == RGBQUAD Structure
				{
					rgb = va_arg( pArgList, RGBQUAD );
					printRGBQUAD( rgb );
				}

				//////////////////////////////////////////////////////////////////////////
				if( matchString( "endfr", &szFormat ) )			// %endfr == 结束前景颜色格式化输出
					SetConsoleTextAttribute( hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
				
				if( matchString( "endbk", &szFormat ) )			// %endbk == 结束背景颜色格式化输出
				{
					SetConsoleTextAttribute( hConsole, 0 );
					SetConsoleTextAttribute( hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
				}
				//--------------------色彩格式化输出---------------------
				//前景颜色
				if( matchString( "frred", &szFormat ) )			// %frred == 前景颜色, 红色
					SetConsoleTextAttribute( hConsole, FOREGROUND_RED );

				if( matchString( "frgreen", &szFormat ) )		// %frgreen == 前景颜色, 绿色
					SetConsoleTextAttribute( hConsole, FOREGROUND_GREEN );

				if( matchString( "frblue", &szFormat ) )		// %frblue == 前景颜色, 蓝色
					SetConsoleTextAttribute( hConsole, FOREGROUND_BLUE );

				if( matchString( "fryellow", &szFormat ) )		// %fryellow == 前景颜色, 黄色
					SetConsoleTextAttribute( hConsole, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY );

				if( matchString( "frcyan", &szFormat ) )		// %frfrcyan == 前景颜色, 青色
					SetConsoleTextAttribute( hConsole, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
				
				if( matchString( "frmag", &szFormat ) )			// %frmag == 前景颜色, 品红
					SetConsoleTextAttribute( hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY );

				//背景颜色
				if( matchString( "bkred", &szFormat ) )			// %bkred == 背景颜色, 红色
					SetConsoleTextAttribute( hConsole, BACKGROUND_RED );

				if( matchString( "bkgreen", &szFormat ) )		// %bkgreen == 背景颜色, 绿色
					SetConsoleTextAttribute( hConsole, BACKGROUND_GREEN );

				if( matchString( "bkblue", &szFormat ) )		// %bkblue == 背景颜色, 蓝色
					SetConsoleTextAttribute( hConsole, BACKGROUND_BLUE );

				if( matchString( "bkyellow", &szFormat ) )		// %bkyellow == 背景颜色, 黄色
					SetConsoleTextAttribute( hConsole, BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY );

				if( matchString( "bkcyan", &szFormat ) )		// %bkfrcyan == 背景颜色, 青色
					SetConsoleTextAttribute( hConsole, BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY );
				
				if( matchString( "bkmag", &szFormat ) )			// %bkmag == 背景颜色, 品红
					SetConsoleTextAttribute( hConsole, BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY );
			}
			break;

		case '\n':					//换行 并结束当前前\背景色输出
			SetConsoleTextAttribute( hConsole, 0 );
			SetConsoleTextAttribute( hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
			_cputs( "\n" );
			szFormat++;
			break;

		case '\a':					//发出 beep 音
			MessageBeep(0);
			szFormat++;
			break;

		default:
			_cprintf( "%c", (char)*szFormat++ );
		}
	}
	va_end( pArgList );
}

//串匹配
BOOL matchString( const char *szSrc, char **szDest )
{
	char *szTmp = *szDest;

	while( *szSrc )
	{
		if( *szSrc != **szDest  )
		{
			*szDest = szTmp;
			return FALSE;
		}	

		szSrc++;
		(*szDest)++;
	}

	return TRUE;
}

//////////////////////////////////////////////////////////////////////////

//输出点
int printPOINT( POINT pt )
{
	_cprintf( "(x=%d, y=%d)", pt.x, pt.y );		//输出格式

	return 0;
}

//输出矩形
int printRECT( RECT rect )
{
	_cprintf( "(left=%d, top=%d, right=%d, bottom=%d)", rect.left, rect.top, rect.right, rect.bottom );

	return 0;
}

//输出尺寸
int printSIZE( SIZE size )
{
	_cprintf( "[cx=%d, cy=%d]", size.cx, size.cy );

	return 0;
}

//输出一组RGB值
int printRGBQUAD( RGBQUAD rgb )
{
	_cprintf( "(blue=%d, green=%d, red=%d, reserved=%d)", rgb.rgbBlue, rgb.rgbGreen, rgb.rgbRed, rgb.rgbReserved );

	return 0;
}

//////////////////////////////////////////////////////////////////////////

//

示范:

#include <windows.h>
#include "mdebug.h"

//////////////////////////////////////////////////////////////////////////

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );

//////////////////////////////////////////////////////////////////////////

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdline, int iCmdShow )
{
	TCHAR szAppName[] = TEXT("mDebug");

	HWND		hwnd;
	MSG			msg;
	WNDCLASS	wndclass;

	wndclass.cbClsExtra			= 0;
	wndclass.cbWndExtra			= 0;
	wndclass.hbrBackground		= GetSysColorBrush( COLOR_3DFACE );
	wndclass.hCursor			= LoadCursor( NULL, IDC_ARROW );
	wndclass.hIcon				= LoadIcon( NULL, IDI_APPLICATION );
	wndclass.hInstance			= hInstance;
	wndclass.lpfnWndProc		= WndProc;
	wndclass.lpszClassName		= szAppName;
	wndclass.lpszMenuName		= NULL;
	wndclass.style				= CS_HREDRAW | CS_VREDRAW;

	if( !RegisterClass(&wndclass) )
	{
		MessageBox( NULL, TEXT("窗口类注册失败!"), TEXT("应用程序错误"), MB_OK | MB_ICONERROR );
		return 0;
	}

	hwnd = CreateWindow(
		szAppName,
		TEXT("mDebug - Win32 Application 调试工具 - Demo"),
		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
		600, 400,
		NULL, NULL, hInstance, NULL
	);

	ShowWindow( hwnd, iCmdShow );
	UpdateWindow( hwnd );

	while( GetMessage(&msg, NULL, 0, 0) )
	{
		TranslateMessage( &msg );
		DispatchMessage( &msg );
	}

	return msg.wParam;
}

//////////////////////////////////////////////////////////////////////////

LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
	RECT rect = {0};
	POINT pt = {0};
	RGBQUAD rgb = {0};

	rgb.rgbBlue = 100;
	rgb.rgbGreen = 125;
	rgb.rgbRed = 213;

	switch( message )
	{
	case WM_CREATE:			//在处理创建消息时对 mDebug 进行初始化
		debugInit();		//初始化 mDebug
		return 0;

	case WM_LBUTTONDOWN:
		rect.left = 10;		rect.top = 20;
		rect.right = 30;	rect.bottom = 40;

		pt.x = 100;		pt.y = 200;

		mPuts( "mDebug提供的普通格式化输出:\n" );				//使用普通格式化输出函数 mPuts
		mPuts( "x = %d, f = %f, c = %c\n\n", 3+5, 1.79, 'w' );

		mPutsEx( "mDebug提供的增强型格式化输出:\n" );			//使用增强型格式化输出函数 mPutEx
		mPutsEx( "RECT结构: %rect\n", rect );
		mPutsEx( "%bkgreen颜色增强:%endbk %fryellow%rect\n", rect );
		mPutsEx( "%frmagRGBQUAD结构:%endbk %bkred%rgb\n", rgb );
		
		return 0;

	case WM_DESTROY:
		debugFree();			//关闭调试窗口
		PostQuitMessage(0);
		return 0;
	}

	return DefWindowProc( hwnd, message, wParam, lParam );
}



Mdebug:基于React开发的移动web调试工具 作者:thinkchen,腾讯 PCG 高级前端开发工程师mdebug是腾讯新闻 TNTWEB 团队推出的基于React开发的新的web调试工具, 沉淀自腾讯新闻微信手 q 双插件多年的移... 阅读详情

相关推荐

逆向工程实战:x64dbg与MDebug在动态调试中的关键技巧解析

本文深入解析了x64dbg与MDebug在动态调试中的核心技巧。通过实战案例,详细演示了如何利用API断点、消息断点及内存断点快速定位并分析程序的关键验证逻辑,特别是针对加密或混淆程序的破解过程。文章强调了动态调试作为“运行时观察”手术刀的重要性,并对比了两款工具在不同场景下的独特优势与高效工作流。

weixin_29274969的博客 1340

mdebug

mdebug a useful debugger for mobile 使用情景 移动端浏览器不方便调试,使用该插件可以快速定位发生错误的位置,输出调试信息,交互执行js代码。 特色 可以在移动端使用,当然PC端也可以用,但没这个必要 示例展示 将mdebug克隆到本地 打开example/demo.html 操作按钮进行使用 快速入门 引入脚本\\ API详解 mdebug.l

ghking1的专栏 758

MDebug 1.04版本 支持64位

最新出来的调试器 支持64位系统 用x64的朋友有福了

标题:【强力推荐】轻巧而全能的移动Web调试利器 - MDebug

标题:【强力推荐】轻巧而全能的移动Web调试利器 - MDebug ???? 引言 在移动前端开发的世界里,一款好的调试工具是提高效率的关键。今天,我要向大家隆重推介一款基于React技术栈的移动web调试神器——MDebug。它不仅简单易用,功能强大,且具备高度可扩展性和卓越的性能。 ???? 项目介绍 MDebug是一款专为移动Web开发者打造的调试工具,旨在简化你的工作流程,提供如同Chrome Dev...

gitblog_00048的博客 357

MDebug1.04

大家一定厌倦了Windbg或Ollydbg吧?现在向大家提供一款调试器,你用他可以得到全新的调试体验。 MyDebug不是一个演示程序或调试器原型。MyDebug是一个切实可用、功能丰富的调试器。感谢那些支持MyDebug和VMPDebugger的人们,祝大家调试愉快!

QT实现类似qDebug()打印输出之mDebug()

QT实现类似qDebug()打印输出之mDebug(),实现了打印opencv和QT的所有基本数据类型。方便调试

mdebug 项目教程

mdebug 项目教程 1. 项目的目录结构及介绍 mdebug 项目的目录结构如下: mdebug/ ├── __tests__/ ├── config/ ├── docs/ ├── public/ ├── scripts/ ├── src/ ├── .editorconfig ├── .gitignore ├── .prettierrc.js ├── CHANGELOG.EN.md ├── C...

gitblog_00503的博客 655

SceneSplat

目标:训练一个网络,输入高斯参数 → 输出与自然语言空间对齐的特征。考虑到标注语义的 3DGS 数据有限,作者设计了。策略,让模型在无标签场景上学到有用表征。都有一个与自然语言对齐的语义特征。这是整个方法的第一步,目标是让。

weixin_61091146的博客 1284

mdebug 开源项目教程

mdebug 开源项目教程 1、项目介绍 mdebug 是一个基于 Node.js 的调试工具,旨在提供一个简单易用的调试环境。它支持多种调试模式,包括本地调试和远程调试,适用于前端和后端开发。mdebug 的核心功能包括日志记录、断点调试、性能分析等,帮助开发者快速定位和解决代码中的问题。 2、项目快速启动 安装 首先,确保你已经安装了 Node.js 和 npm。然后,通过以下命令安装 mde...

gitblog_00031的博客 768

深入解析AndroidManifest.xml与device_admin.xml:打造完美DeviceOwner应用配置

本文深入解析了Android企业级开发中DeviceOwner应用的核心配置文件AndroidManifest.xml与device_admin.xml。详细阐述了如何精准声明DeviceAdminReceiver、定义管理策略,并提供了通过ADB命令进行设置与验证的实战指南,帮助开发者构建权限完整、配置正确的设备所有者应用。

ice55的博客 681

ubuntu20.04配置UR机械臂的仿真环境

gazebo和rviz中的机械臂的位姿是一样的,要实现同步控制,可以拖动rviz中的球移动到指定位置,点击plan观察路径规划,点击execute执行该路径规划,可以在gazebo和rviz中同步看到刚刚的路径规划运动,实现了简单的机械臂仿真环境搭建。这是因为catkin找的python版本为anaconda下面的版本,所以需要改为指定采用下面的命令,参考之前的。之后要source一下,才能读取到工作空间里的文件,以后每次打开终端进入工作空间都要执行该命令。时,一直不成功,解决办法可以看我之前写的。

weixin_48319333的博客 3494

基于React的Web调试工具mdebug常见问题解决方案

基于React的Web调试工具mdebug常见问题解决方案 1. 项目基础介绍和主要编程语言 mdebug是一个基于React开发的轻量级Web调试工具,旨在为开发者提供类似于Chrome Devtools的功能体验。它支持React组件的调试,并提供日志、网络、元素、代理、存储、性能等多种调试功能。mdebug易于集成,特别适合移动端的前端开发调试。该项目的主要编程语言是JavaScript,使...

gitblog_00235的博客 986

博图Advanced实战:VB脚本实现HMI画面智能弹出(附完整代码解析)

本文详细介绍了在西门子博图Advanced平台中利用VB脚本实现HMI画面智能弹出的实战方法。通过动态计算坐标、分辨率自适应方案和完整代码解析,帮助工程师解决不同显示环境下的定位难题,提升工业自动化界面的交互体验。

weixin_29041767的博客 343

國內的另一個調試器 http://www.mdebug.org

國內的另一個調試器 http://www.mdebug.org

操作系统开发 1098

关键词‖旋变传感器

旋转变压器(以下简称旋变)安装在永磁同步驱动电机的非传动端,其作用是检测转子的位置和速度。目前,通常采采用结构简单、坚固耐用、环境适应性好的磁阻式旋变作为位置传感器。

m0_72345077的博客 2151

【教程4>第2章>第19节】 GMSK解调系统的FPGA开发与matlab对比验证

MSK(Minimum Shift Keying,最小频移键控)和GMSK(Gaussian Minimum Shift Keying,高斯最小频移键控)都是数字调制技术,主要用于无线通信系统中将数字信号转换为模拟信号进行传输。它们都是连续相位移键控(Continuous Phase Shift Keying, CPK)的一种形式,意味着相邻码元之间没有相位跳变的突变,而是连续过渡,这有助于减少信号带宽和降低邻道干扰。GMSK的解调过程与MSK类似,我们这里还是采用和MSK解调一样的1bit解调方法。

FPGA/MATLAB学习教程/源码/项目合作开发 1221

探索移动Web调试新境界:MDebug

探索移动Web调试新境界:MDebug 在移动Web开发的世界里,调试一直是一个令人头疼的问题。如何在移动设备上高效地进行调试,一直是开发者们追求的目标。今天,我们要介绍的这款开源项目——MDebug,正是为了解决这一难题而生。 项目介绍 MDebug是一款基于React开发的移动Web调试工具,旨在为开发者提供一个功能全面、易于扩展且高性能的调试环境。它不仅支持类Chrome DevTools的...

gitblog_00581的博客 891

2025年09月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

2025年09月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

伶俐角少儿编程 639

QT Debug的使用心得

无

qq_42964109的博客 1792

【基于 CasADi 的欠驱动无人船实时非线性模型预测控制(NMPC)实现 Visual Studio 2022 C++】

本文介绍了基于CasADi和IPOPT在Visual Studio 2022 C++环境下实现的欠驱动无人船实时非线性模型预测控制(NMPC)方案。文章详细阐述了NMPC基本原理、欠驱动无人船动力学模型(包含状态变量和控制变量定义),并给出了C++实现的核心代码框架。该方案通过显式引入系统动力学模型和约束条件,在每个采样周期滚动优化控制序列,有效解决了欠驱动无人船的轨迹跟踪与避碰问题。文中还提供了VS2022配置CasADi环境的详细步骤,包括预编译包下载、工程属性设置等关键环节,为工程实现提供了完整的技术

vor234的博客 653

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Qt ——debug调试

程序调试:方法一:断点调试法方法二:使用qDebug()函数功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 方法一:断...

weixin_45375588的博客 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

vsnprintf函数使用

简介 作用:使用vsnprintf()用于向一个字符串缓冲区打印格式化字符串,且可以限定打印的格式化字符串的最大长度。 此函数需要C99或者C++11及以上版本才能支持。 int vsnprintf (char * sbuf, size_t n, const char * format, va_list arg ); 参数sbuf:用于缓存格式化字符串结果的字符数组 参数n:限定最多打印到缓冲区sbuf的字符的个数为n-1个,因为vsnprintf还要在结果的末尾追加\0。如果格式化字符串长度大

luliplus的博客 2万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

vsnprintf函数详解-----学习了解

vsnprintf函数:C标准库函数-<starg.h> (虽然网上说实在stdarg.h中,但是我在arm的stdarg.h中没有看到这个函数,有点疑惑) **int vsnprintf(char s, size_t n, const char format, va_list arg) 功能:将格式化的可变参数列表写入大小的缓冲区 ...

alongBATTLE的博客 4855
上一篇: Windows程序设计 第十章 菜单资源类文件
下一篇: Windows程序设计 第十一章 模态对话框
sergery
博客等级 码龄18年 113粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值