2011-10-27 2 views
3

파일 스택에 스레드 스택을 덤프하려고합니다. 리눅스에서 어떻게 할 수 있습니까? 스택의 시작 주소와 크기를 어떻게 알 수 있습니까? 이 프로세스를 progammatically (ptrace, gdb 또는 이와 유사한 것을 사용하지 않음)로하고 싶습니다.스레드 스택을 덤프하는 방법

gdb -p 1234 

을 그리고 다음 역 추적을 얻을 수 bt을 입력

+0

디버거를 사용해 보셨습니까? – sidyll

+0

디버거를 사용하지 않고 프로그래밍 방식으로하고 싶습니다. – MetallicPriest

+0

콜 스택 또는 모든 스택의 덤프를 가져 오시겠습니까? –

답변

0

사용 gdb는 PID (프로세스 ID)를 통해 실행중인 프로세스에 연결합니다.

+0

gdb를 사용하고 싶지 않습니다. 내 프로그램에서 해보고 싶습니다. – MetallicPriest

1

사용 pthread_attr_getstack 기능을 사용할 수 있습니다; 이렇게하면 스레드의 스택 주소와 크기가 산출됩니다.

+1

이것은 작업을 수행하지 않습니다. 쓰레드가 시스템 할당 스택을 사용하고 있다면,'pthread_attr_getstack'은 주소와 크기를 0으로 반환 할 것입니다. –

+0

@ denniston.t 어떻게 pthread_getattr_np? – MetallicPriest

+0

@ MetallicPriest 내가 생각하기에 작동 할 것이지만 정의상 휴대용이 아닙니다 :-). 그것은 OP의 필요에 따라 중요하지 않을 수 있습니다. –

0

스레드의 더미를 덤프 하시겠습니까 ??

application checkpointing을 받으시겠습니까? 네가 원한다면, 그것을 구현하는 라이브러리가있다. 심지어 불완전하지만 실제로는 유용하다.

요점은, 스레드의 스택을 파일로 덤핑해도 그 파일에 유용한 기능을 수행 할 수 있을지 확신 할 수 없다는 점입니다. 심지어 같은 구성에서 다시 시작될 때 0 자리를 쓰지 않는 한 스택이 다른 곳에있을 수 있기 때문에

내가 들었을 수도 있기 때문에이 스택을 사용하여 응용 프로그램을 다시 시작할 수는 없습니다. 실행중인 프로세스가 해당 프로세스를 중단하지 않고 코어 파일 (나중에 gdb으로 검사 할 수 있음)을 덤프하도록하는 Linux 라이브러리.

콜 스택 (call stack)은 매우 부서지기 쉽기 때문에 예방 조치없이 다시 사용할 수 없습니다.

+0

예, 기본적으로 검사 점을 지정합니다. 필자가 생각한 한 가지 생각은 pthread_attr_setstack을 사용하여 스택을 설정 한 다음 프로세스를 체크 포인트로 포크하는 것입니다. 그러나 포크가 죽는 사람 이외의 모든 스레드가 죽어서 스레드를 다시 만들고 죽은 스레드에서 스택을 복사하려고합니다. 그러나, 나는 여전히 죽은 쓰레드를위한 CPU 레지스터를 얻는 방법을 알아야한다. – MetallicPriest

+0

그런 다음 기존 검사 점 인프라를 사용하는 것이 좋습니다. 평소와 마찬가지로, 악마가 세부 사항에 있습니다. –

+0

오픈 소스 검사 점 인프라에 대해 친절하게 알려줄 수 있습니까? 고마울거야. – MetallicPriest

관련 문제