有关OutputDebugString的一点儿事实
我最近花了一些时间分析OutputDebugString方法。在我的另一个实验中,我需要一个仅依赖于本机API的OutputDebugString版本。在实现它的过程中,我发现了一些关于OutputDebugString的有趣的事实,也许您也会感兴趣。
OutputDebugString的工作原理
简而言之,OutputDebugString尝试将消息发送到附加到给定进程的调试器,如果没有调试器侦听,则尝试将全局节映射到进程内存中并将调试消息保存在其中。我使用本机API实现OutputDebugStringA(ANSI版本)的示例如下:
void NTAPI RtlOutputDebugStringA(_In_opt_ LPCSTR OutputString) {
if (OutputString) {
EXCEPTION_RECORD exceptionRecord{ };
exceptionRecord.ExceptionCode = DBG_PRINTEXCEPTION_C;
exceptionRecord.NumberParameters = ;
exceptionRecord.ExceptionInformation[] = strlen(OutputString) + ;
exceptionRecord.ExceptionInformation[] = reinterpret_cast<ULONG_PTR>(OutputString);
__try {
RtlRaiseException(&exceptionRecord);
} __except (EXCEPTION_EXECUTE_HANDLER) {
NotifyGlobalDebugOutputMonitor(OutputString);
}
}
}
RtlOutputDebugStringA(以及OutputDebugString)检查调试器存在的方式非常有趣:它引发了一个异常。如果有一个调试器正在侦听,它将吞了异常(异常代码:0x40010006L表示ANSI消息,0x4001000A表示UNICODE消息),并且处理程序将永远不会执行。我们都知道异常是昂贵的,我们应该只在特殊情况下使用它们。因此,对跟踪的每个写操作都抛出异常似乎不正确。稍后我将向您展示一些基准测试结果和解决此问题的简单方法(我想您已经知道了)。但是关于NotifyGlobalDebugOutputMonitor方法的前几句话。它使用一个全局映射部分、两个事件对象和一个互斥对象来编写调试消息。事件对象和互斥锁保护该节防止并发使用。我不会过多地讨论这个问题;如果你感兴趣,可以看看张玉武关于代码项目的优秀文章。您还可以在github上查看我的实现的源代码(它只是一个POC,所以请不要在接近生产的地方使用它)。可以说,在系统中运行调试输出监视器(如DebugView)也会对OutputDebugString性能产生负面影响,特别是当多个进程同时向调试输出写入数据时。
有关OutputDebugString的一点儿事实的更多相关文章
- 程序员必须要知道的Hadoop的一些事实
程序员必须要知道的Hadoop的一些事实.现如今,Apache Hadoop已经无人不知无人不晓.当年雅虎搜索工程师Doug Cutting开发出这个用以创建分布式计算机环境的开源软...... 1: ...
- SSAS中事实表中的数据如果因为一对多或多对多关系复制了多份,在维度上聚合的时候还是只算一份
SSAS事实表中的数据,有时候会因为一对多或多对多关系发生复制变成多份,如下图所示: 图1 我们可以从上面图片中看到,在这个例子中,有三个事实表Fact_People_Money(此表用字段Money ...
- 20个人艰不拆的事实:知道真相的我眼泪掉下来 T.T
20个人艰不拆的事实:知道真相的我眼泪掉下来 T.T 原文链接http://www.u148.net/article/113612.html 来源:ruoning WuMo是丹麦画家Mikael Wu ...
- 《C专家编程》第四章——令人震惊的事实:数组和指针并不相同
数组和指针是C语言里相当重要的两部分内容,也是新手程序员最容易搞混的两个地方,本章我们锁定指针与数组,探讨它们的异同点. 首先来看指针与数组在声明上的区别: int a[10]; int *p; 很明 ...
- SqlServer Analysis Service的事实维度关系
什么是Fact(事实)维度关系 开发过SSAS Cube的开发人员应该都知道,Cube的维度用法中有一种叫Fact(事实)关系类型,如下图所示: Fact(事实)维度关系就如同上面截图中红框中的描述一 ...
- 《BI那点儿事—数据的艺术》理解维度数据仓库——事实表、维度表、聚合表
事实表 在多维数据仓库中,保存度量值的详细值或事实的表称为“事实表”.一个按照州.产品和月份划分的销售量和销售额存储的事实表有5个列,概念上与下面的示例类似. Sate Product Mouth U ...
- delphi使用outputdebugstring调试程序和写系统日志
delphi使用outputdebugstring调试程序和写系统日志 procedure TForm1.btn1Click(Sender: TObject); begin OutputDebugSt ...
- 战胜忧虑<3>——学会接受不可避免的事实。
学会接受不可避免的事实. 对必然的事情愉快地承受,就像杨柳承受风雨,水接受一切容器,我们也要承受一切事实. 故事: 在美国庆祝陆军在北非获胜的那一天,我接到国防部送来的一封电报,我的侄儿——我最爱的一 ...
- 使用OutputDebugString输出调试信息
在编写控制台程序的时候我们经常会使用printf输出调试信息,使我们了解程序的状态,方便调试,但是当编写非控制台程序的时候这种方法就行不通了,那我们应该怎么办?上网查了一些方法,大致就如下几种 使用L ...
随机推荐
- golang语言特性
1. 垃圾回收 a. 内存⾃动回收,再也不需要开发⼈员管理内存 b. 开发人员专注业务实现,降低了心智负担 c. 只需要new分配内存,不需要释放 2. 天然并发 a. 从语⾔层面⽀持并发,⾮常简 ...
- vins_fusion学习笔记
Vins-Fusion源码:https://github.com/HKUST-Aerial-Robotics/VINS-Fusion 摘要 应项目需要,侧重学习stereo+gps融合 转载几篇写的比 ...
- 明解C语言 入门篇 第七章答案
练习7-1 #include <stdio.h> int main() { int n; printf(,, ); //此行显示结果为 4 3 6 因为1的字节就是为4,而-1的字节也是4 ...
- spring-retry 重试机制的使用
场景:由于网络抖动原因,或者其他原因,需要对代码重新执行,这个就需要重试了. import org.springframework.context.annotation.Configuration; ...
- Android 5.0以下系统支持TLS 1.1/1.2协议版本
一.背景 项目中,客户端与服务端之间普遍使用Https协议通信,突然接到测试同事反馈Android5.0以下手机上,App测试服使用出现问题,出现SSL handshake aborted错误信息,但 ...
- ES6入门系列 ----- Reflect
Reflect 是ES6 为了操作对象而提供的新的API, 目的是: 将Object 上一些明显属于语言内部的方法,比如 Object.defineProperty 放到 Reflect对象上 ...
- css3+JS实现幻灯片轮播图
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- oracle高级部分
回顾 多表关联查询的方式 内连接 根据AB表关联的条件进行过滤查询,只保留满足条件数据 Select * from a,b where a.xxx=b.xxx; Select * from a inn ...
- QML 缓存(QML Caching)
最近一直在学习QML,在Qt Creator中新建Qt Quick工程后,尝试不断地修改qml文件来进行试验,qml文件需要反反复复的修改. Qt Widget工程,如果修改了cpp代码后,直接构建或 ...
- javaEE复习重点个人总结
最近在学院或集队的群里看见最多的就是求javaEE大作业了,那么突然有感而发,写点参考性的期末复习总结. 第一章JavaEE 概述: 1:两层体系应用体系结构 安全性低,部署困难,消耗系统资源 2 三 ...