localtime() crashing with segmentation fault in c

泄露秘密 提交于 2020-01-15 06:59:10

问题


Have a bit of trouble tracking down the cause of this.

Here is the code bit:

    #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);
}

It crashes on localtime line:

Segmentation fault (core dumped)

Any ideas?


回答1:


The sample code runs fine for me. Post your full code? Or cut down your example to minimal possible which still reproduces problem. And run gdb on your core 'gdb -c a.core a.out' and get a backtrace(bt).

One gotcha with localtime is the returned pointer is a pointer to a static global var and subsequent calls to localtime update the var. Tripped me up once long long ago.

struct tm *localtime(const time_t *time)

The return value is a pointer to a static broken-down time structure, which might be overwritten by subsequent calls to any of the date and time functions. (But no other library function overwrites the contents of this object.)

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

On searching for core files:

See also core dumped - but core file is not in current directory?

Make sure system can write core file.
* for me on one sample ununtu system ulimit -c showed 0 *

ulimit -c unlimited

Check what pattern used and change the pattern to a simple one or different location.

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

Search some common locations and look in /var/log/messages:

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

On ubuntu examine the apport service config and init/rcfiles:

find /etc/ |grep appo



回答2:


This may or may not be something close to your problem? Still don't quite have enough info to be sure what you are doing. I'd be thinking localtime is not the problem but somewhere in the printfs there are problems . . .

How are you compiling your project? g++ or gcc?

Can you print a string?? (as opposed to string ptr) What is a string in your context?

1 problem here:

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

If string is typedef a char[] then passing a pointer to it in func args would be better?

Compiling your sample making some assumptions and adding debug (-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 

* lots more JUNK follows res string itself cannot be passed in on stack and printed *

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) 

* see line 66 there is also a problem * might well be the way I have have declared string :-P

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

* If you can find a core file yourself then it would be a big help!!! *

If you can't find core then maybe you could use ltrace. Run strace to get trace of all system calls a process does. Run ltrace to get trace of all lib calls a process does.

Try:

strace ls

ltrace ls

On my crashing example:

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


来源:https://stackoverflow.com/questions/22518992/localtime-crashing-with-segmentation-fault-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!