简单的Logger类VSNPrintf正在随着读取访问违规行为而崩溃
Simple logger class vsnprintf is crashing with read access violation
在实现简单的printf样式记录器时,我遇到了vsnprintf崩溃。这就是我称之为Logger实用程序的方式:
LoggerUtil->LogInfo("Whatever info here %s", "just a test!");
它调用具有可变数量参数的函数。这个想法是在格式字符串中添加额外信息,因此我需要更改FMT:
std::string LoggerUtil::LogClientInfo(const char* fmt)
{
return "Some info here %s";
}
void LoggerUtil::LogInfo(const char* fmt, ...)
{
std::string formatStr = LogClientInfo(fmt); // returns "Some info here %s" just for testing altering the format string
const char* format = formatStr.c_str(); // checked memory and its ' ' terminated string
va_list arg_list;
va_start(arg_list, format);
Logger::InfoVA(format, arg_list);
va_end(arg_list);
}
void Logger::InfoVA(const char* fmt, va_list arg_list)
{
Log(Priority_Info, fmt, arg_list);
}
void Logger::Log(Priority priority, const char* fmt, va_list args)
{
char str[MaxLogEntrySize];
memset(str,0,MaxLogEntrySize*sizeof(char));
vsnprintf(str,MaxLogEntrySize-1, fmt, args); // CRASH :(
...
}
无法弄清楚主要问题,而不是通过FMT来解决问题,但这不是一个选择:
void LoggerUtil::LogInfo(const char* fmt, ...)
{
va_list arg_list;
va_start(arg_list, fmt);
Logger::InfoVA(fmt, arg_list);
va_end(arg_list);
}
我在这里缺少什么?
使用LogClientInfo()
创建新格式字符串后,然后将错误的输入值传递给第二个参数到va_start()
。您正在传递本地format
变量,但是您需要传递fmt
的CC_4参数。仅仅因为您在调用Logger::InfoVA()
时使用了其他格式字符串,不会在存储输入格式值的情况下更改。va_start()
将va_list
配置为指向相对于指定参数的下一个函数参数,在这种情况下,它需要为fmt
函数参数,而不是本地format
变量:
void LoggerUtil::LogInfo(const char* fmt, ...)
{
std::string formatStr = LogClientInfo(fmt);
va_list arg_list;
va_start(arg_list, fmt); // <-- use fmt here !
Logger::InfoVA(formatStr.c_str(), arg_list);
va_end(arg_list);
}
相关文章:
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- 在目标计算机上访问 POSIX 信号灯时出现可执行文件崩溃(SEGV_MAPERR)
- 无法访问的代码如何导致我的程序崩溃?
- 使用向量的函数崩溃,调试器说访问冲突读取位置
- 我的单例中的数组在离开函数后没有保留信息,然后在尝试再次访问信息时崩溃
- 为什么 CUDA 在访问类成员时崩溃?
- 将多面体转换为nef(违反访问)时,与CGAL崩溃
- Windows C++程序中的访问冲突是否总是立即崩溃
- libtorrent和tcp ::受体在Windows上崩溃并违反访问
- 程序在访问shared_ptr持有QString时崩溃
- 访问使用 def 文件导出的静态变量时崩溃
- 程序在尝试创建和访问二维矢量时崩溃
- C 程序在出口时崩溃,内存中的访问违规
- 简单的Logger类VSNPrintf正在随着读取访问违规行为而崩溃
- Dx11 访问 XMMATRIX 时崩溃
- 如何调试C++非托管代码中的较低级别文件访问异常/崩溃
- GLFW setUserPointer/getUserPointer发送/访问类崩溃
- MySQL 连接器/C++ 错误访问崩溃