`
touchinsert
  • 浏览: 1291900 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

使用OutputDebugString调试窗口程序

阅读更多

学编程是从DOS下开始的,用了一定时间的TC2.0,使得养成了用printf输出变量值进行调试的坏习惯。到了写窗口程序时,就遇到了些麻烦。
窗口程序没有方便的进行控制台输出的方法(其实是我不知道),于是,用了几年的用MessageBox进行输出的调试手段,太麻烦了,因为MessageBox会打断程序流程,还要人为手动让它继续运行,这是最让人恼火的。
后来用上了VC.NET2003,发现有OutputDebugString这个调试API,在IDE下调试,则会把它的输出定向到IDE中的Debugger上。
再后来发现了DebugTrack,它可以截获OutputDebugString的输出,而不用开其它笨重的debugger。
于是,照着它的参考文档,自己写了个截获OutputDebugString输出的程序LLYF DebugCapture。
DebugCapture完全按照这份文档(http://www.unixwiz.net/techtips/outputdebugstring.html
)中的方法来捕捉调试输出:
先建立一个新线程,在线程中循环:
void __fastcall TCaptureDBString::Execute()
{
/********************************************************************************************
* 1. Create the shared memory segment and the two events. If we can't, exit.
* 2. Set the DBWIN_BUFFER_READY event so the applications know that the buffer is available.
* 3. Wait for the DBWIN_DATA_READY event to be signaled.
* 4. Extract the process ID NUL-terminated string from the memory buffer.
* 5. Go to step #2
********************************************************************************************/
TSharedMem sm("DBWIN_BUFFER", sizeof(struct dbwin_buffer));
TListItem *Item;
char szFileName[MAX_PATH];
hBufReadyEvent = CreateEvent(
NULL, // no security attributes
FALSE, // auto-reset event
FALSE, // initial state is nonsignaled
"DBWIN_BUFFER_READY" // object name
);

if (hBufReadyEvent == NULL)
{
MessageBox(GetActiveWindow(),
"Cannot create event of DBWIN_BUFFER_READY",
NULL,
MB_OK);
return;
}

hDataReadyEvent = CreateEvent(
NULL, // no security attributes
FALSE, // auto-reset event
FALSE, // initial state is nonsignaled
"DBWIN_DATA_READY" // object name
);

if (hBufReadyEvent == NULL)
{
MessageBox(GetActiveWindow(),
"Cannot create event of DBWIN_DATA_READY",
NULL,
MB_OK);
return;
}

while(1)
{
::SetEvent(hBufReadyEvent);
::WaitForSingleObject(hDataReadyEvent, INFINITE);
if(Terminated) //Thread terminated flag
{
::SetEvent(hBufReadyEvent);
CloseHandle(hBufReadyEvent);
CloseHandle(hDataReadyEvent);
return;
}
DebugString = *((struct dbwin_buffer*)(sm.Buffer()));
EnterCriticalSection(&CriticalSection);

//display the result string
//including PID,Output string, Process Path
Item = MainForm->DebugListView->Items->Add();
Item->Caption = IntToStr(MainForm->DebugListView->Items->Count);
Item->SubItems->Add(IntToStr(DebugString.dwProcessId));
Item->SubItems->Add(DebugString.data);
Item->SubItems->Add(GetProcessPath(DebugString.dwProcessId, szFileName));
ListView_EnsureVisible(MainForm->DebugListView->Handle,MainForm->DebugListView->Items->Count-1,false);

LeaveCriticalSection(&CriticalSection);
}
}
其中用于内存映射进行数据传递的结构如下:
struct dbwin_buffer {
DWORD dwProcessId;
char data[4096-sizeof(DWORD)];
};
这样,我也可以不用借助其它debugger进行像DOS下的调试了。
如果要更像printf一点,还可以对OutputDebugString加上一个Wrapper:
#include <stdio.h>
#include <stdarg.h>
/*************************************************
* Example usage(Just like C library function **printf**):
* ......
* OutputDebugPrintf("Error: %d.", GetLastError());
* ......
*************************************************/
void OutputDebugPrintf(LPCTSTR ptzFormat, ...)
{
va_list vlArgs;
TCHAR tzText[1024];
va_start(vlArgs, ptzFormat);
wvsprintf(tzText, ptzFormat, vlArgs);
OutputDebugString(tzText);
va_end(vlArgs);
}
调用OutputDebugPrintf就可以像printf进行格式化输出了,哈哈。

分享到:
评论

相关推荐

    在桌面程序中使用Printf输出调试信息

    的时候打印调试信息通常习惯是用自己封装好的函数利用 OutPutDebugString函数输出然后借助DbgView查看,但是有时候系统上其它程序也用OutPutDebugString在输出一些信息的时候,这样的话DbgView窗口上的信息就显得很...

    一个专业的调试工具软件

    * 发布的软件包中附带有一个带源码的Demo程序,演示了如何使用_TRACE将调试信息输出到Tracer工具的窗口中,同时演示了当Demo程序运行崩溃时通过Tracer进行BUG的源码定位,您可以马上看到Tracer所报告出来的错误所在...

    一个专业的VC++软件调试工具

    * 发布的软件包中附带有一个带源码的Demo程序,演示了如何使用_TRACE将调试信息输出到Tracer的窗口中,同时演示了当Demo程序运行崩溃时通过Tracer进行BUG的源码定位,您可以马上看到Tracer所报告出来的错误所在的源...

    调试开发工具集

    使用 Microsoft 内核调试程序检查真实系统。 LoadOrder 查看设备加载到 WinNT/2K 系统中的顺序。 LogonSessions 列出系统中的活动登录会话。 MoveFile 使您可以安排在系统下一次重新启动时执行移动和删除命令。 ...

    各种反调试技术原理与实例 VC版

    4. RDTSC/ GetTickCount时间敏感程序段 7 5. StartupInfo结构 7 6. BeingDebugged 8 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags 10 8. DebugPort: CheckRemoteDebuggerPresent()/...

    各种反调试技术原理与实例

    4. RDTSC/ GetTickCount时间敏感程序段 7 5. StartupInfo结构 7 6. BeingDebugged 8 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags 10 8. DebugPort: CheckRemoteDebuggerPresent()/...

    各种反调试技术原理与实例 VC版[学习CK].

    4. RDTSC/ GetTickCount时间敏感程序段 6 5. StartupInfo结构 7 6. BeingDebugged 8 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags 9 8. DebugPort: CheckRemoteDebuggerPresent()/...

    关于一些调试器的反调试技术

    4. RDTSC/ GetTickCount时间敏感程序段 7 5. StartupInfo结构 7 6. BeingDebugged 8 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags 10 8. DebugPort: CheckRemoteDebuggerPresent()/...

    反调试技术源码与实例汇编版

    4. RDTSC/ GetTickCount时间敏感程序段 7 5. StartupInfo结构 7 6. BeingDebugged 8 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags 10 8. DebugPort: CheckRemoteDebuggerPresent()/...

    各种反调试技术原理与实例VC版

    4. RDTSC/ GetTickCount时间敏感程序段 7 5. StartupInfo结构 7 6. BeingDebugged 8 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags 10 8. DebugPort: CheckRemoteDebuggerPresent()/...

    注册表批量修改权限命令

    使用 Microsoft 内核调试程序检查真实系统。 LoadOrder 查看设备加载到 WinNT/2K 系统中的顺序。 LogonSessions 列出系统中的活动登录会话。 MoveFile 使您可以安排在系统下一次重新启动时执行移动和删除命令。 ...

    OllyDbg 1.1 增强版

    注:OD在调试程序是,无法打开配置程序,本人水平有限,无法修正 发现Bug,请及时通告,e_mail:gjianbo@163.com QQ:30481007 以下是OllyDbg Fix Module的介绍 OllyDbg Fix Module v0.9.0.0 使用 LordPE 等...

    Windows Sysinternals Suite v2019.06.29.zip

    使用 Microsoft 内核调试程序检查真实系统。 LoadOrder 查看设备加载到 WinNT/2K 系统中的顺序。 LogonSessions 列出系统中的活动登录会话。 MoveFile 使您可以安排在系统下一次重新启动时执行移动和删除命令...

    个性化ODOllyDbg

    注:OD在调试程序是,无法打开配置程序,本人水平有限,无法修正 发现Bug,请及时通告,e_mail:gjianbo@163.com QQ:30481007 以下是OllyDbg Fix Module的介绍 OllyDbg Fix Module v0.9.0.0 使用 LordPE 等...

    OllyDbg调试器

    说明:该版本来自看雪学院 一个新的动态追踪工具,将IDA与...修正Themida v1.9.x.x检测OllyICE的Anti,配合HideToolz即可调试Themida v1.9.x.x加壳程序。 14.LOCKLOSE添加了部分API和结构体信息。 &lt;br&gt;

    SysinternalsSuite

     使用 Microsoft 内核调试程序检查真实系统。  LoadOrder  查看设备加载到 WinNT/2K 系统中的顺序。  LogonSessions  列出系统中的活动登录会话。  MoveFile  使您可以安排在系统下一次重新启动时执行移动和...

    微软Sysinternals Suite工具包 2018.12.18 官方版.zip

    使用 Microsoft 内核调试程序检查真实系统。LoadOrder 查看设备加载到 WinNT/2K 系统中的顺序。LogonSessions 列出系统中的活动登录会话。MoveFile 使您可以安排在系统下一次重新启动时执行移动和删除命令。...

    SysinternalsSuite windows工具集合

    DebugView: Sysinternals 的又一首创: 该程序可以拦截设备驱动对 DbgPrint 的调用和Win32程序对OutputDebugString 的调用. 程序可以浏览或记录本机或远程计算机上调试会话的输出,而无须激活调试器. Desktops:...

    Sysinternals 微软系统监控实用工具

    使用 Microsoft 内核调试程序检查真实系统。 LoadOrder v1.0(2006 年 11 月 1 日) 查看设备加载到 WinNT/2K 系统中的顺序。 LogonSessions v1.0(2006 年 11 月 1 日) 列出系统中的活动登录会话。 MoveFile v...

    OllyICE v1.10 修改版

    OllyICE.EXE与OLLYDBG.EXE同时做了如下修改: 1.窗口、类名等常见修改;...13.修正Themida v1.9.x.x检测OllyICE的Anti,配合HideToolz即可调试Themida v1.9.x.x加壳程序。 14.LOCKLOSE添加了部分API和结构体信息。

Global site tag (gtag.js) - Google Analytics