【发布时间】:2016-12-20 23:02:54
【问题描述】:
我在 C 语言中有一个可变参数函数可以写入日志文件,但是一旦调用它,它就会在标头中给出分段错误。
在主进程中,调用格式如下:
mqbLog("LOG_INFORMATION",0,0,"Connect",0,"","Parameter received");
函数是这样定义的:
void mqbLog(char *type,
int numContext,
double sec,
char *service,
int sizeData,
char *data,
char *fmt,
...
)
{
//write the log in the archive
}
编译正常。当我调试过程时,对mqbLog函数的调用完成,它在函数的左括号中给出了分段错误,所以我可以询问函数值:
(gdb) p type
$1 = 0x40205e "LOG_INFORMATION"
(gdb) p numContext
$2 = 0
(gdb) p sec
$3 = 0
(gdb) p service
$4 = 0x0
(gdb) p sizeData
$5 = 4202649
(gdb) p data
$6 = 0x0
我们将不胜感激地接受任何想法。
【问题讨论】:
-
您在实现该功能时遇到了错误。我建议先阅读
<stdarg.h>周围的相应手册。 -
给我们足够的代码来复制错误。
-
函数的声明在哪里?您的调用依赖于原型范围内
0到0.0的隐式转换。省略调用函数的原型本质上是未定义的行为;在调用可变参数函数之前,您必须始终在范围内拥有原型。你的函数崩溃了,但你没有展示你是如何实现这个函数的。您希望我们如何帮助您调试它?你可能做错了很多事情;其中许多可能导致崩溃。请包含重现崩溃的 MCVE (minimal reproducible example)。 -
您可以看到
sizeData没有对齐,这看起来更像是某个指针(0x402099)。如果这个函数在不同的翻译单元中声明,我的猜测是声明与定义不符。尝试为sec传递类似3.14的内容并再次调试。但首先,在启用所有警告的情况下编译您的程序。 -
@PeterCordes:GDB 提出的问题与这些问题类似。我更愿意从 OP 那里获取信息,但你的推断可能是正确的。