我在机器中使用vsnprintf并且它没有给出错误但是当我运行精确的代码时它会给我错误。
我在机器上遇到错误的机器
Linux localhost 3.14.1-1-ARCH #1 SMP PREEMPT Mon Apr 14 20:40:47 CEST 2014 x86_64 GNU/Linux
机器我没有收到任何关于此的错误。
Linux arunkumar.gupta 3.8.0-27-generic #40-Ubuntu SMP Tue Jul 9 00:19:35 UTC 2013 i686 i686 i686 GNU/Linux
代码
void
_log_message(int level, char *fmt, ...)
{
int n;
char *msg;
va_list args;
char time_string[TIME_LENGTH];
char str[STRING_LENGTH];
assert(level <= log_level);
va_start(args, fmt);
fill_time_string(time_string, TIME_LENGTH);
n = snprintf(str, STRING_LENGTH, "%-9s %s [%s:%lu]: ", log_string[level], time_string, log_ident, (long int) getpid());
msg = str + n;
n += vsnprintf(msg, STRING_LENGTH-n, fmt, args);
if(n >= STRING_LENGTH) {
strcpy(str+STRING_LENGTH-6, " ...\n");
n = STRING_LENGTH-1;
}
va_end(args);
}
Backtrace输出
./a.out(handler+0x25)[0x401152]
/usr/lib/libc.so.6(+0x35400)[0x7fb0e2358400]
/usr/lib/libc.so.6(_IO_vfprintf+0x1cf0)[0x7fb0e236b1f0]
/usr/lib/libc.so.6(vsnprintf+0x79)[0x7fb0e2395459]
./a.out(_log_message+0x1b7)[0x40169c]
./a.out(csc_open+0x71)[0x401894]
./a.out(open_log_file+0x43)[0x4018e3]
./a.out(main+0x5a)[0x4019c2]
/usr/lib/libc.so.6(__libc_start_main+0xf5)[0x7fb0e2344b05]
./a.out[0x401069]
请帮助我,它给我的Arch Linux机器(这是32位机器)而不是Ubuntu 13.04(64位机器)上的错误。 如果可能,建议我任何替代方案?
答案 0 :(得分:2)
我遇到了这个老问题,因为类似的事情发生在我身上。经过一番摸索后,我发现原因是我的格式化方法的某些调用具有如下内容:
int64_t num;
foo("%d", num);
在这种情况下,foo
是将"%d"
和num
作为vsnprintf
和fmt
传递到args
的函数。在64位体系结构中,这可以很好地工作,但是对于32位体系结构,这给了我SIGSEGV。
解决方法是将%d
更改为%lld
,或者按照How to print a int64_t type in C的建议将其更改为:
"%" PRId64