program tip

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

radiobox 2020. 9. 25. 07:45
반응형

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


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


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

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


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

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

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


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

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

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

여기에 더 자세한 정보

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

(gdb) info registers

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

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

(gdb)info line *$rip

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

(gdb) list *$rip

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

하지만 아마도

(gdb) frame

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


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


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

참고 URL : https://stackoverflow.com/questions/14581837/gdb-how-to-print-the-current-line-or-find-the-current-line-number

반응형