2011-09-30 2 views
3

내 응용 프로그램의 스레드 중 일부가 최적화 된 기능에 앉아 있고 응용 프로그램을 디버깅 할 때 gdb가 해당 기능에서 역 추적 할 수 없습니다. 하지만 어셈블러에서 검토 한 부분 같은 것을 수행하여 이전 함수의 프레임에 손까지로 스택을 휴식을 취하실 수 있습니다 : 나는 라이브 디버깅을하고있어 경우Linux (MIPS) : 코어 덤프를 볼 때 임시로 "내용을 변경"합니다.

set $old_ra = $ra 
set $old_sp = $sp 
set $ra = *(unsigned long*)($sp+28) 
set $sp = $sp + 48 
bt 
set $ra = $old_ra 
set $sp = $old_sp 

이 완벽하게 작동하고, 성공적으로 보여줍니다 완전한 백 트레이스. 코어 덤프를 볼 때 같은 오프라인 작업을 수행 할 수 있기를 원합니다. 분명히 핵심 덤프에서는 레지스터 파기라는 개념이 의미가 없지만 gdb에 "이 값을 레지스터에 사용"할 수있는 방법이 있으므로 비슷한 백 트레이스를 수행 할 수 있습니까?

답변

2

기본적으로 제공되지 않습니다. 내가 찾은 유일한 방법은 코어 파일을 물리적으로 수정하는 것입니다. ELF 코어 파일은 대개 프로세스의 레지스터를 포함하는 하나 이상의 'reg'섹션을 가지고 있습니다. 이 섹션에서 정확하게 변경하고자하는 레지스터가 어디에 있는지 알아 내서 파일을 편집하고, 거기에 새로운 값을 넣고 GDB를 다시 실행하기 만하면됩니다.

관련 문제