strftime_l lib64 / libc.so.6中的SIGSEGV分段错误

我把从UNIX移植到LINUX的pro * c代码。 代码被编译并成功创build可执行文件。 但在运行期间,它会引起分段错误。 我一步步debugging代码,下面是GDBdebugging的输出。

Breakpoint 4 at 0x3b19690f50 (gdb) n 525 strftime (buf, MAX_STRING_LEN, "%d/%b/%Y:%H:%M:%S", dummy_time); (gdb) n Breakpoint 4, 0x0000003b19690f50 in strftime () from /lib64/libc.so.6 (gdb) n Single stepping until exit from function strftime, which has no line number information. 0x0000003b19690f70 in strftime_l () from /lib64/libc.so.6 (gdb) n Single stepping until exit from function strftime_l, which has no line number information. Program received signal SIGSEGV, Segmentation fault. 0x0000003b19690f8b in strftime_l () from /lib64/libc.so.6 

实际上在代码中调用了strftime()函数。 但我不知道为什么它在/lib64/libc.so.6中达到strftime_l()

这个问题不在UNIX中。 请帮忙。 代码是

 static void speed_hack_libs(void) { time_t dummy_time_t = time(NULL); struct tm *dummy_time = localtime (&dummy_time_t); struct tm *other_dummy_time = gmtime (&dummy_time_t); char buf[MAX_STRING_LEN]; strftime (buf, MAX_STRING_LEN, "%d/%b/%Y:%H:%M:%S", dummy_time); } 

 struct tm *dummy_time = localtime (&dummy_time_t); struct tm *other_dummy_time = gmtime (&dummy_time_t); 

这不会工作。 从手册页 :

localtime()函数将日历时间timep转换为相对于用户指定时区表示的细分时间表示。 … 返回值指向一个静态分配的结构 ,可能被随后调用任何日期和时间函数覆盖。

gmtime()函数将日历时间timep转换为以协调世界时(UTC)表示的细分时间表示。 当年份不适合整数时, 它可能会返回NULL返回值指向一个静态分配的结构 ,可能会被随后调用任何日期和时间函数覆盖。

所以, *dummy_time可能会被你使用它的时间覆盖,并且包含不可预知的垃圾。 您应该像这样将数据复制到您的缓冲区:

 struct tm dummy_time ; memcpy(&dummy_time, localtime (&dummy_time_t), sizeof(struct tm)); 

虽然我不知道这怎么会导致一个SIGSEGV(可能是获取月份名称等 – 检查问题是否仍然存在LC_ALL=C ),您必须解决这个问题,然后才能继续。 另外,检查(在调试器中) *dummy_time的内容。

它调用strftime_l是因为你编译了64位 – 这是strftime的64位库入口点。 strftime中有两个指针 – 一个字符串和一个struct tm指针。 其中之一是指向无效的记忆。 jpalacek给了你先看的地方。

你添加了time.h头文件吗? 我想你已经错过了。