具有可变参数的 C 函数崩溃
C function with variable arguments crashing
我写了一个函数来帮助我调试一个项目:
static void outputDebug(unsigned uintLineNo, const char* cpszFormat, ...) {
char szPrefix[80], szOut[256];
va_list ap;
va_start(ap, cpszFormat);
sprintf_s(szPrefix, sizeof(szPrefix), "%s %s %05ld %s\n"
, __DATE__, __TIME__, uintLineNo, cpszFormat);
vsprintf_s(szOut, sizeof(szOut), "%s", szPrefix, ap);
va_end(ap);
OutputDebugString(szOut);
}
此函数的示例:
outputDebug(__LINE__, "AdapterInit(%s)", "Test");
格式字符串 AdapterInit(%s)
之后的所有内容都是可选的,我单步执行了该函数,它毫无问题地构造了 szPrefix
,例如,它包含类似的内容; Apr 18 2018 07:33:07 01492 Adapter(%s)
下一行 vsprintf
导致异常:
Unhandled exception at 0x0781e9ee (msvcr90d.dll) in ....
我看不出我做错了什么,我该如何解决?
[编辑] 问题出在从 vsprintf
开始的行中,删除不必要的 %s
解决了问题。
工作解决方案:
static void outputDebug(unsigned uintLineNo, const char* cpszFormat, ...) {
char szPrefix[80], szOut[256];
va_list ap;
va_start(ap, cpszFormat);
sprintf_s(szPrefix, sizeof(szPrefix), "%s %s %05ld %s\n"
, __DATE__, __TIME__, uintLineNo, cpszFormat);
vsprintf_s(szOut, sizeof(szOut), szPrefix, ap);
va_end(ap);
OutputDebugString(szOut);
}
如果我收集正确,您将 szPrefix
构造为新的格式字符串(通过将 cpszFormat
插入其中,添加前缀)。所以对vsprintf_s
的调用应该使用that,而不是%s
。即
vsprintf_s(szOut, sizeof(szOut), szPrefix, ap);
您为 szPrefix
(即 80)选择的尺码也相当乐观。可能值得将其提高一两个档次。
我写了一个函数来帮助我调试一个项目:
static void outputDebug(unsigned uintLineNo, const char* cpszFormat, ...) {
char szPrefix[80], szOut[256];
va_list ap;
va_start(ap, cpszFormat);
sprintf_s(szPrefix, sizeof(szPrefix), "%s %s %05ld %s\n"
, __DATE__, __TIME__, uintLineNo, cpszFormat);
vsprintf_s(szOut, sizeof(szOut), "%s", szPrefix, ap);
va_end(ap);
OutputDebugString(szOut);
}
此函数的示例:
outputDebug(__LINE__, "AdapterInit(%s)", "Test");
格式字符串 AdapterInit(%s)
之后的所有内容都是可选的,我单步执行了该函数,它毫无问题地构造了 szPrefix
,例如,它包含类似的内容; Apr 18 2018 07:33:07 01492 Adapter(%s)
下一行 vsprintf
导致异常:
Unhandled exception at 0x0781e9ee (msvcr90d.dll) in ....
我看不出我做错了什么,我该如何解决?
[编辑] 问题出在从 vsprintf
开始的行中,删除不必要的 %s
解决了问题。
工作解决方案:
static void outputDebug(unsigned uintLineNo, const char* cpszFormat, ...) {
char szPrefix[80], szOut[256];
va_list ap;
va_start(ap, cpszFormat);
sprintf_s(szPrefix, sizeof(szPrefix), "%s %s %05ld %s\n"
, __DATE__, __TIME__, uintLineNo, cpszFormat);
vsprintf_s(szOut, sizeof(szOut), szPrefix, ap);
va_end(ap);
OutputDebugString(szOut);
}
如果我收集正确,您将 szPrefix
构造为新的格式字符串(通过将 cpszFormat
插入其中,添加前缀)。所以对vsprintf_s
的调用应该使用that,而不是%s
。即
vsprintf_s(szOut, sizeof(szOut), szPrefix, ap);
您为 szPrefix
(即 80)选择的尺码也相当乐观。可能值得将其提高一两个档次。