gdb : 현재 줄을 인쇄하거나 현재 줄 번호를 찾는 방법은 무엇입니까?


94

list 명령은 행 세트를 인쇄하지만 한 행이 필요합니다. 내가있는 위치와 오류가 발생한 위치입니다.


23
backtrace또는 where, 심지어 info line또는 단순히 bt(역 추적의 경우). dirac.org/linux/gdb gdb를 튜토리얼
dwalter

bt또는 backtrace또는 것은 where함수 호출 스택을 인쇄 f또는 frame실행하기 위해 다음 줄을 인쇄 할 수 있습니다.
Eric Wang

답변:


21

디버깅하는 동안 동일한 정보를 얻습니다. 스택 추적을 확인하는 동안은 아니지만. 아마도 당신은 내가 생각하는 최적화 플래그를 사용했을 것입니다. 이 링크를 확인하십시오 -관련이 있습니다.

-g3최적화 플래그 를 제거 하여 컴파일을 시도하십시오 . 그러면 작동 할 수 있습니다. HTH!


1
아, 내 프로그램이 -g디버그 정보를 포함하도록 컴파일되었지만 현재는 공유 라이브러리 중 하나에서 가져온 스택 프레임에 있으며 라인 정보를 포함하도록 컴파일되지 않은 것 같습니다. 고마워, 쿠마.
Boris Burkov 2013 년

104

'프레임'명령은 찾고있는 것을 제공합니다. ( 'f'로 축약 할 수 있습니다.) 다음은 예입니다.

(gdb) frame
\#0  zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139         int rc = fq.recv (msg_);
(gdb)

인수가 없으면 'frame'은 현재 위치를 알려줍니다 (인수를 사용하면 프레임이 변경됨). 프레임 명령에 대한 자세한 정보는 여기 에서 찾을 수 있습니다 .


21

gdb는 저수준 명령을 수행 할 수있는 강력한 명령이므로 어셈블리 개념과 관련이 있습니다.

당신이 찾고있는 것은 de 명령 포인터라고합니다.

명령어 포인터 레지스터는 프로세서가 다음에 실행을 시도 할 메모리 주소를 가리 킵니다. 명령어 포인터는 16 비트 모드에서는 ip , 32 비트 모드에서는 eip , 64 비트 모드에서는 rip이라고 합니다.

여기에 더 자세한 정보

gdb 실행에서 사용할 수있는 모든 레지스터는 다음과 같이 표시 할 수 있습니다.

(gdb) info registers

이를 통해 프로그램이 실행중인 모드를 찾을 수 있습니다 (이 레지스터 중 어떤 것이 존재하는지 확인).

그런 다음 (여기 에서는 요즘 가장 일반적인 레지스터 립을 사용 하고 필요한 경우 eip 또는 매우 드물게 ip로 교체 ) :

(gdb)info line *$rip

줄 번호와 파일 소스가 표시됩니다.

(gdb) list *$rip

이전과 이후에 몇 줄을 보여줄 것입니다.

하지만 아마도

(gdb) frame

많은 경우에 충분해야합니다.


2
GDB는 16 비트 모드를 지원하지 않으므로 ip여기에서는 사용되지 않습니다. 또한 프로그램 카운터의 이름을 명시 적으로 철자하는 대신 GDB의 별칭을 사용할 수 있습니다 $pc.. 그래서 x/10i $pc관계없이 건축의 현재 명령 포인터 10 개의 지시를 분해한다 - 그것은 I386, x86_64의에서 작동, ARM 등
루슬란

18

명령 이나 프레임을 사용할 수 있습니다. 여기서 명령은 함수 이름과 함께 더 많은 정보를 제공합니다.


2

위의 모든 답변이 정확합니다. 내가 선호하는 것은 사용자에게 매우 유용한 별도의 창에 위치와 기능을 표시하는 tui 모드 (ctrl + XA)를 사용하는 것입니다. 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.