답변:
디버깅하는 동안 동일한 정보를 얻습니다. 스택 추적을 확인하는 동안은 아니지만. 아마도 당신은 내가 생각하는 최적화 플래그를 사용했을 것입니다. 이 링크를 확인하십시오 -관련이 있습니다.
-g3
최적화 플래그 를 제거 하여 컴파일을 시도하십시오 . 그러면 작동 할 수 있습니다. HTH!
-g
디버그 정보를 포함하도록 컴파일되었지만 현재는 공유 라이브러리 중 하나에서 가져온 스택 프레임에 있으며 라인 정보를 포함하도록 컴파일되지 않은 것 같습니다. 고마워, 쿠마.
gdb는 저수준 명령을 수행 할 수있는 강력한 명령이므로 어셈블리 개념과 관련이 있습니다.
당신이 찾고있는 것은 de 명령 포인터라고합니다.
명령어 포인터 레지스터는 프로세서가 다음에 실행을 시도 할 메모리 주소를 가리 킵니다. 명령어 포인터는 16 비트 모드에서는 ip , 32 비트 모드에서는 eip , 64 비트 모드에서는 rip이라고 합니다.
여기에 더 자세한 정보
gdb 실행에서 사용할 수있는 모든 레지스터는 다음과 같이 표시 할 수 있습니다.
(gdb) info registers
이를 통해 프로그램이 실행중인 모드를 찾을 수 있습니다 (이 레지스터 중 어떤 것이 존재하는지 확인).
그런 다음 (여기 에서는 요즘 가장 일반적인 레지스터 립을 사용 하고 필요한 경우 eip 또는 매우 드물게 ip로 교체 ) :
(gdb)info line *$rip
줄 번호와 파일 소스가 표시됩니다.
(gdb) list *$rip
이전과 이후에 몇 줄을 보여줄 것입니다.
하지만 아마도
(gdb) frame
많은 경우에 충분해야합니다.
ip
여기에서는 사용되지 않습니다. 또한 프로그램 카운터의 이름을 명시 적으로 철자하는 대신 GDB의 별칭을 사용할 수 있습니다 $pc
.. 그래서 x/10i $pc
관계없이 건축의 현재 명령 포인터 10 개의 지시를 분해한다 - 그것은 I386, x86_64의에서 작동, ARM 등
위의 모든 답변이 정확합니다. 내가 선호하는 것은 사용자에게 매우 유용한 별도의 창에 위치와 기능을 표시하는 tui 모드 (ctrl + XA)를 사용하는 것입니다. 도움이되기를 바랍니다.
backtrace
또는where
, 심지어info line
또는 단순히bt
(역 추적의 경우). dirac.org/linux/gdb gdb를 튜토리얼