2

この原因を突き止めるのに少し苦労します。

コードビットは次のとおりです。

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

何か案は?

4

2 に答える 2

1

サンプル コードは問題なく動作します。完全なコードを投稿しますか? または、例を可能な限り最小限に減らしても問題が再現されます。コア 'gdb -c a.core a.out' で gdb を実行し、バックトレース (bt) を取得します。

localtime の 1 つの落とし穴は、返されるポインターが静的グローバル変数へのポインターであり、localtime への後続の呼び出しが変数を更新することです。ずっと前に一度私をつまずかせました。

struct tm *localtime(const time_t *time)

戻り値は、静的な分解された時間構造体へのポインタであり、日付関数と時間関数のいずれかへの後続の呼び出しによって上書きされる可能性があります。(ただし、他のライブラリ関数がこのオブジェクトの内容を上書きすることはありません。)

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

コア ファイルの検索時:

コア ダンプも参照してください- しかし、コア ファイルは現在のディレクトリにありませんか?

システムがコアファイルを書き込めることを確認してください。
*私にとって、ununtuシステムの1つのサンプルで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
于 2014-03-19T22:25:30.037 に答える
1

これはあなたの問題に近いかもしれませんし、そうでないかもしれませんか? あなたが何をしているのかを確認するには、まだ十分な情報がありません。localtime は問題ではないと思いますが、printfs のどこかに問題があります。. .

プロジェクトをどのようにコンパイルしていますか? g++ または gcc?

文字列を印刷できますか?? (文字列 ptr とは対照的に) あなたの文脈における文字列とは何ですか?

ここに1つの問題:

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

string が char[] の typedef である場合、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 
于 2014-03-20T23:30:40.777 に答える