![코어 덤프를 생성하는 전체 명령을 복원합니다.](https://linux55.com/image/83069/%EC%BD%94%EC%96%B4%20%EB%8D%A4%ED%94%84%EB%A5%BC%20%EC%83%9D%EC%84%B1%ED%95%98%EB%8A%94%20%EC%A0%84%EC%B2%B4%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EB%B3%B5%EC%9B%90%ED%95%A9%EB%8B%88%EB%8B%A4..png)
작업 중인 프로그램이 충돌하고 코어 덤프를 생성합니다. 문제는 호출되는 매개변수와 관련이 있다고 생각합니다. 그 중 일부는 다른(다소 복잡한) 프로그램에 의해 자동으로 생성됩니다. 그래서 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
주어진 인수로 올바른 프로그램을 기록하는 간단한 쉘 래퍼를 사용하는 것입니다 .
답변2
나는 썼다pargs
리눅스 버전. 따라서 코어 파일이 있으면 RHEL 6에서도 모든 매개변수를 표시할 수 있습니다.
$ pargs core.MyApplication.1234
argv[0]: /usr/libexec/gvfsd-network
argv[1]: --spawner
argv[2]: :1.16
argv[3]: /org/gtk/gvfs/exec_spaw/2
또는 gdb
실행 파일이 있고 여전히 사용 가능한 경우 GDB를 사용하여 모든 인수를 표시할 수 있습니다.
$ gdb MyApplication core.MyApplication.1234
(gdb) bt
[..]
#4 0x000055a376101e1b in main (argc=4, argv=0x7ffca4780f08)
at daemon-main-generic.c:45
(gdb) frame 4
(gdb) set print address off
(gdb) show print pretty
(gdb) p *argv@argc
$1 = {"/usr/libexec/gvfsd-network", "--spawner", ":1.16",
"/org/gtk/gvfs/exec_spaw/2"}
두 가지 방법을 비교하면 pargs
코어 파일만 필요하고 추가 대화형 입력이 필요하지 않습니다.