作業中のプログラムがクラッシュし、コアダンプを生成します。問題は、呼び出されるパラメータに関連していると思います。そのうちのいくつかは他の(やや複雑な)プログラムによって自動的に生成されます。だからgdb
デバッグfile core.MyApplication.1234
をしたり。
しかし、コマンドは非常に冗長で、出力は次のようになります。
core.MyApplication.1234: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './MyApplication -view -mwip localhost -mwnp 12345 -mwlp 12346 -mwti 12347 -Debu'
(この例の名前を変更しましたが、理解できます。)
この後にはさらにパラメータがあることがわかりますが、コアファイルではコマンドは常に80文字に切り捨てられます。両方をgdb
報告file
してください。出力を見ると、objdump
「-Debu」以降も切り捨てられたように見え、残りの部分がコアダンプに書き込まれたかどうかはわかりません。
RHEL6で実行中です。私が見つけたこのスレッドは2007年のものです。Solarisシステムを使用するソリューションについて説明していますが、pargs
これは私のシステムでは有効なコマンドではなく、Red Hatの「同等の」コマンドはコアファイルではなく実行中のプロセスでのみ機能することに気付きました。
プログラムの実行に使用された完全なコマンドをどのように復元できますか?可能ですか?
ベストアンサー1
データがあります(少なくとも999項目、合計6885バイト以上の数字)。
> cat segfault.c
int main(int argc, char *argv[])
{
char *s = "hello world";
*s = 'H';
}
> cc -g -o segfault segfault.c
> limit coredumpsize 9999999
> ./segfault `perl -le 'print "blah$_" for 1..999'`
Segmentation fault (core dumped)
> strings core.12231 | grep -c blah
1000
その後、高速altagoobingleduckgoingを使用しgdb
てデバッグシンボルを想定すると、次のように復元できます。
> gdb ./segfault core.12231
...
(gdb) p argc
$1 = 1000
(gdb) x/1000s *argv
...
"$@"
別のオプションは、どこかに記録し、与えられた引数exec
で正しいプログラムを記録する単純なシェルラッパーを使用することです。