GDB에서 최상위 호출 스택 프레임으로 직접 이동할 수 있습니까?


9

무한 재귀 엉망으로 깊이 내려간 후 결함을 세분화하는 C 프로그램이 있습니다. 호출 스택 프레임의 깊이 는 1000 프레임 이상 이고 반복되는 함수 호출은 일련의 4 개의 일반적인 재귀 함수 호출이므로 중단 점은 쓸모없는 것처럼 보이기 때문에 GDB에서 프로세스를 역 추적하는 것은 쓸모가 없습니다 . 역 추적에 대한 반복 된 호출은 계속해서 네 가지 함수 이름을 계속해서 읽습니다. 'up' 'up' 'up'...을 사용하면 더 높아질 것이므로이 패턴이 처음 어디서 시작되었는지 알 수 있지만 최상위 통화에서 시작하는 것이 더 효율적인 것처럼 보입니다. 필자의 직감은 프로세스의 초기에 무한 재귀가 시작되기 때문입니다. 콜 스택에 총 N 프레임이 있다면, 내가 할 수 있다는 것을 알고 있습니다.

gdb>> up N

스택의 상단 (N 번째 프레임)에 도달하지만 문제는 N을 모른다는 것입니다. 호출 스택에서 총 프레임 수를 찾는 명령이 있습니까? 아니면 최상위 프레임으로 점프하기위한 매끄러운 내장 GDB 명령이 있습니까? 최상위 프레임이 main () 함수 여야한다는 것이 나에게 일어났습니다. 그 지식을 활용하여 최상위 프레임에 도달 할 수 있습니까?

답변:


9

내 테스트에서 매우 큰 수의 'up'을 사용하면 최상위 프레임이 표시됩니다.

(gdb) up 99999
#58 0x0000000000442fb4 in main ()

1
스택 크기가 99999보다 큰 경우 작동하지 않음
Vivandiere

이 답변은 저에게 효과적이었습니다. 더 큰 숫자를 사용해야했습니다.
tesch1

23

최상위 프레임부터 시작하려면 음수로 'bt'를 지정할 수 있습니다.

bt -20

그런 다음 'frame'(또는 'f')을 사용하여 원하는 프레임으로 직접 이동할 수 있습니다.


1

fr 0최상위 스택 프레임으로 이동합니다. fr프레임을 나타냅니다.


2
그것은 잘못된 방향입니다
tesch1

@ tesch1 공정하지만 gdb backtrace는 맨 아래를 보여줍니다 :)
Vivandiere
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.