【发布时间】:2018-06-17 08:04:51
【问题描述】:
我正在为 syslog 编写一个简单的包装器,以使我的程序中的日志记录更容易一些,并允许在选择时将日志条目转储到控制台。我定义了以下日志函数
void logDebugFunction (int lineNumber, char* filename, const char* functionName, char* format, ...)
{
if (LOG_DEBUG >= argPtr->logLevel)
{
char buffer[1000];
char *entry;
va_list args;
va_start(args, format);
vsprintf(buffer, format, args);
va_end(args);
sprintf(entry, "%s:%d - %s - %s",filename, lineNumber, functionName, buffer);
syslog(LOG_MAKEPRI(0, (LOG_DEBUG)), "%s", entry);
if (argPtr->verbose)
{
// Print to stdout too
printf( "%s", entry);
printf("\n");
}
}
}
通过以下宏调用:
#define logDebug(format,...) logDebugFunction(__LINE__, __FILE__, __func__, format, __VA_ARGS__)
来自main函数,如下:
int main(int argc, char *argv[])
{
// Set up syslog connection
openlog("ARController", LOG_CONS|LOG_PID|LOG_NDELAY, LOG_DAEMON);
// Set up our global arguments
struct arguments arguments;
argPtr = &arguments;
// set default values
arguments.verbose = 0;
arguments.foreground = 0;
arguments.logLevel = LOG_WARNING;
// Send a test debug message
logDebug("Test Debug message %d %s", 5, "a string");
// Close our syslog connection
closelog();
}
现在,当我尝试运行时,我得到的唯一输出是 Segmentation fault (core dumped),显然不是我想要的。
我使用 gdb 和 --save-temps 标志进行了一些调查,以验证以下内容:
- 在
main.i中,我可以看到main中的logDebug 调用已替换为logDebugFunction(72, "src/main.c", __func__, "Test Debug message %d %s", 5, "a string");,这是我希望在这里看到的。 - 运行时,段错误发生在
logDebugFunction中的第一行vsprintf - 就在调用
vsprintf之前,函数的所有强制参数都是正确的:Breakpoint 2, logDebugFunction (lineNumber=72, filename=0x401450 "src/main.c", functionName=0x4014d3 <__func__.4035> "main", format=0x401437 "Test Debug message %d %s")
-
va_list条目是我所期望的,如以下 gdb 命令所示 (found here)(gdb) p *(int *)(((char*)args[0].reg_save_area)+args[0].gp_offset) $5 = 5(gdb) p *(char * *)(((char*)args[0].reg_save_area)+args[0].gp_offset+8) $6 = 0x40142e "a string"
当我进入
vsprintf调用时,参数似乎是正确的:__IO_vsprintf (string=0x7ffffffedb40 "\200V", format=0x401437 "Test Debug message %d %s", args=0x7ffffffedb28) at iovsprintf.c: 32`
所以一切似乎都井井有条,我有点不知道问题是什么以及我下一步可以采取什么步骤。
【问题讨论】:
-
您的代码引用集合比minimal reproducible example 更像是一个谜题。请edit让帮助您更轻松。
标签: c linux debugging segmentation-fault printf