これはあなたの問題に近いかもしれませんし、そうでないかもしれませんか? あなたが何をしているのかを確認するには、まだ十分な情報がありません。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