Unicode下TRACE中文(_CrtDbgReport: String too long or IO Error)
在使用Unicode的工程项目中,如果是Debug模式。
当TRACE Unicode字符串时,会输出提示:_CrtDbgReport: String too long or IO Error
函数原型:void OutputDebugString(LPCTSTR lpOutputString);
功能说明:该函数输出一个字符串给调试器用于显示
例子:
原语句:TRACE(_T("\n这是一个TRACE语句"));
替换为:OutputDebugString (_T("\n这是一个TRACE语句"));
其他相关函数:
1. CheckRemoteDebuggerPresent:用于判断指定进程是否在调试状态
2. ContinueDebugEvent:使调试器继续运行之前报告了debugging event的线程
3. DebugActiveProcess:使调试器附加到一个活动进程上并进行调试
4. DebugActiveProcessStop:停止正在调试指定进程的调试器
5. DebugBreak:在当前进程中触发一个断点
6. DebugBreakProcess:在指定的进程中触发一个断点
7. DebugSetProcessKillOnExit:空白
8. FatalExit:空白
8. FlushInstructionCache:空白
10. GetThreadContext:空白
11. GetThreadSelectorEntry:空白
12. IsDebuggerPresent:空白
13. OutputDebugString:
14. ReadProcessMemory:空白
15. SetThreadContext:空白
16. WaitForDebugEvent:空白
17. WriteProcessMemory:空白
方法二:调用setlocale将语言环境设置成中文
相关说明:
函数原型:char *setlocale(int category,const char *locale );
功能说明:给指定的类别设置语言环境
注意:需要将原先的语言环境保存,待使用完后将其恢复。
例子:
#include <locale.h>
char* old_locale = _strdup( setlocale(LC_ALL,NULL) );
free(old_locale);
其他相关函数:
1. char *_strdup(const char *strSource );
调用malloc分配内存,并将源字符串复制一份,需要用free释放。
//======================================================================
优缺点比较:
方法一:优点:不需要增加任何函数调用,可以直接使用OutputDebugString输出字符串
缺点:不能格式化输出。需要预先将字符串格式化
方法二:优点:可以直接使用TRACE,不加任何改变
缺点:需要进行例子中的操作。
当TRACE Unicode字符串时,会输出提示:_CrtDbgReport: String too long or IO Error
有两种方法来解决这个问题
方法一:直接使用 OutputDebugString 替换 TRACE
相关说明:函数原型:void OutputDebugString(LPCTSTR lpOutputString);
功能说明:该函数输出一个字符串给调试器用于显示
例子:
原语句:TRACE(_T("\n这是一个TRACE语句"));
替换为:OutputDebugString (_T("\n这是一个TRACE语句"));
其他相关函数:
1. CheckRemoteDebuggerPresent:用于判断指定进程是否在调试状态
2. ContinueDebugEvent:使调试器继续运行之前报告了debugging event的线程
3. DebugActiveProcess:使调试器附加到一个活动进程上并进行调试
4. DebugActiveProcessStop:停止正在调试指定进程的调试器
5. DebugBreak:在当前进程中触发一个断点
6. DebugBreakProcess:在指定的进程中触发一个断点
7. DebugSetProcessKillOnExit:空白
8. FatalExit:空白
8. FlushInstructionCache:空白
10. GetThreadContext:空白
11. GetThreadSelectorEntry:空白
12. IsDebuggerPresent:空白
13. OutputDebugString:
14. ReadProcessMemory:空白
15. SetThreadContext:空白
16. WaitForDebugEvent:空白
17. WriteProcessMemory:空白
方法二:调用setlocale将语言环境设置成中文
相关说明:
函数原型:char *setlocale(int category,const char *locale );
功能说明:给指定的类别设置语言环境
注意:需要将原先的语言环境保存,待使用完后将其恢复。
例子:
#include <locale.h>
char* old_locale = _strdup( setlocale(LC_ALL,NULL) );
setlocale( LC_ALL, "chs" );
//正常使用TRACE,退出时调用下面函数
setlocale( LC_ALL, old_locale);free(old_locale);
其他相关函数:
1. char *_strdup(const char *strSource );
调用malloc分配内存,并将源字符串复制一份,需要用free释放。
//======================================================================
优缺点比较:
方法一:优点:不需要增加任何函数调用,可以直接使用OutputDebugString输出字符串
缺点:不能格式化输出。需要预先将字符串格式化
方法二:优点:可以直接使用TRACE,不加任何改变
缺点:需要进行例子中的操作。
疑问:
1. 调用char* plocale = setlocale(LC_ALL,NULL); 返回值是"C."对吗?
分类:
C++/C
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2011-12-29 MVC笔记
2011-12-29 JavaScript中With 语句使用方法实例
2011-12-29 区别Javascript中的Null与Undefined
2011-12-29 JavaScript中typeof知多少?