localtime()因c中的分段错误而崩溃

时间:2014-03-19 21:56:20

标签: c fault localtime

在追查原因时遇到一些麻烦。

这是代码位:

    #include <time.h>
time_t now;
struct tm *mytime;
char yyyy[5];
char mm[3];
char dd[3];
char mname[10];
if(time(&now)!=(time_t)(-1))
{
    mytime=localtime(&now);
    strftime(yyyy, sizeof(yyyy), "%Y", mytime);
    strftime(mm, sizeof(mm), "%m", mytime);
    strftime(dd, sizeof(dd), "%d", mytime);
    strftime(mname, sizeof(mname), "%B", mytime);
}

它在localtime行崩溃:

Segmentation fault (core dumped)

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

示例代码对我来说运行正常。发布完整代码?或者将您的示例减少到最小可能仍然会重现问题。并在你的核心上运行gdb&g; -c a.core a.out&#39;得到一个回溯(bt)。

本地时间的一个问题是返回的指针是指向静态全局变量的指针,随后对localtime的调用更新了var。很久很久以前就把我绊倒了。

struct tm * localtime(const time_t * time)

返回值是指向静态故障时间结构的指针,可能会被后续调用任何日期和时间函数覆盖。 (但是没有其他库函数会覆盖此对象的内容。)

自: http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_17.html

搜索核心文件时:

另见core dumped - but core file is not in current directory?

确保系统可以编写核心文件 *对我来说,一个示例ununtu系统ulimit -c显示0 *

ulimit -c unlimited

检查使用的模式,并将模式更改为简单的一个或不同的位置。

cat /proc/sys/kernel/core_pattern
#sysctl -w kernel.core_pattern=core

搜索一些常见位置并查看/ var / log / messages:

ls /var/crash /var/cache/abrt /var/spool/abrt/ /tmp/*core*
tail /var/log/messages

在ubuntu上检查apport服务配置和init / rcfiles:

find /etc/ |grep appo

答案 1 :(得分:1)

这可能与您的问题有关,也可能不是? 仍然没有足够的信息来确定你在做什么。 我认为本地时间不是问题,但在printfs的某个地方存在问题。 。 。

您是如何编译项目的? g ++或gcc?

你能打印一个字符串吗? (而不是字符串ptr) 你的上下文中的字符串是什么?

这里有一个问题:

fprintf(stdout,"# Single electron capture cross sections, %s state-selective\n",res);

如果string是typedef char [],那么在func args中传递指针会更好吗?

编译样本做出一些假设并添加调试(-g3):

gcc -g3 stackoverflow_localtime_crash.c -o socrash

./socrash 

# Single electron capture cross sections, RESSTRING state-selective
# Magic number=20032014, 20 March 2014, 
# Single electron capture cross sections, RESSTRING state-selective
# ^0+ +  -> ^-1+ + ^+
# Method=MCLZ
#  et al. 2014, to be submitted
# ----------------------------------------------------------------------------
# Energy        Cross sections (10^-16 cm^2)
# (eV/u)        LABELSTRING                     �H���u�j 

*更多JUNK遵循 res字符串本身不能在堆栈上传入并打印*

Segmentation fault (core dumped)

gdb -c core socrash 

Core was generated by `./socrash'.
Program terminated with signal 11, Segmentation fault.
[New process 10298]
#0  0xb770e713 in strlen () from /lib/tls/i686/cmov/libc.so.6
(gdb) bt
#0  0xb770e713 in strlen () from /lib/tls/i686/cmov/libc.so.6
#1  0xb76da6d9 in vfprintf () from /lib/tls/i686/cmov/libc.so.6
#2  0xb76e0b9f in fprintf () from /lib/tls/i686/cmov/libc.so.6
#3  0x08048a42 in prtcsheader (cs=0xbf9e907c, labels=0xbf9e90bc, res=0xbf9e90a8 "RESSTRING") at stackoverflow_localtime_crash.c:66
#4  0x08048b36 in main (argc=Cannot access memory at address 0x0
) at stackoverflow_localtime_crash.c:80
(gdb) list
64      fprintf(stdout,"%-15s","# (eV/u)");
65      for(i=0;labels[i]!=NULL;i++)
66          fprintf(stdout,"\t%-14s",labels[i]);
67      fprintf(stdout,"\t%-14s","Total");
68  
69  return 0;
(gdb) 

*见第66行还有问题* 可能是我已经声明字符串的方式:-P

66          fprintf(stdout,"\t%-14s",labels[i]);

*如果您可以自己找到核心文件,那将是一个很大的帮助! *

如果你找不到核心,那么也许你可以使用ltrace。 运行strace以跟踪进程执行的所有系统调用。 运行ltrace以跟踪进程执行的所有lib调用。

尝试:

strace ls

ltrace ls

在我崩溃的例子上:

ltrace ./socrash 1>stdout.log 2>socrash_ltrace.log
less socrash_ltrace.log