在追查原因时遇到一些麻烦。
这是代码位:
#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)
有什么想法吗?
答案 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