我正在处理的程序崩溃并生成核心转储。我认为这个问题与调用它的参数有关,其中一些参数是由另一个(相当复杂的)程序自动生成的。所以我尝试使用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'
Run Code Online (Sandbox Code Playgroud)
(我确实更改了此示例的名称,但您明白了。)
我知道在这之后还有几个参数,但在核心文件中,命令总是被截断为 80 个字符。两者gdb
并file
报告此事。查看objdump
我的输出,我不确定其余部分是否已写入核心转储,因为它似乎在“-Debu”之后也被切断了。
我在 RHEL6 上运行它。我发现这个 2007 年的线程描述了使用 Solaris 系统的解决方案pargs
,但这在我的系统上不是有效命令,而且我发现 Red Hat“等效项”仅适用于运行进程,而不适用于核心文件。
如何恢复用于运行程序的整个命令?这甚至可能吗?
数据就在那里(至少有 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
Run Code Online (Sandbox Code Playgroud)
然后通过一些快速的 altagoobingleduckgoinggdb
并假设调试符号,这可以通过以下方式恢复:
> gdb ./segfault core.12231
...
(gdb) p argc
$1 = 1000
(gdb) x/1000s *argv
...
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用一个简单的 shell 包装器来记录"$@"
某处,然后exec
使用给定的参数记录正确的程序。
归档时间: |
|
查看次数: |
3343 次 |
最近记录: |