2017-05-11 6 views
0

중단 점에 도달 할 때마다 파일에 전체 콜백을 기록하는 중단 점에 명령을 첨부하고 싶습니다. 성능에 어려움을 겪을 수도 있으므로 가능한 한 압축 된 정보를 인쇄하고 싶습니다. 그러나, bt 명령은 항상 심볼, 라인 등 파일과 같은 많은 정보를 출력합니다.gdb에 최소 스택 인쇄

디버깅이 끝난 후에도 호출 계층 구조를 재구성 할 수 있도록 bt에 가능한 한 적은 것을 인쇄하는 대안이 있습니까? ? 마찬가지로 스택에있는 함수의 명령 포인터 만 출력 할 수 있습니까? 나는이 하드 성능을 칠 수 있다는 것을 알고 있기 때문에

안부

+0

"* may * hit"? 너 해봤 어? 실제 입출력 전에 필터링하려고 했습니까? –

+0

내 희망은 함수 주소 만 생성하는 bt의 버려진 버전입니다. 그 외, 함수 주소에 대한 bt 출력을 필터링하는 방법을 모르겠습니다. – user5024425

+0

그 질문을 한 이유가 있습니다. 사람들은 인공적인 문제를 일으키는 이런 경향이 있습니다 ... –

답변

1

, 나는 가능한 한 응축으로 정보를 인쇄 할.

느린 정보는 인쇄되지 않습니다. 중단 점에 도달했다는 단순한 사실은 이미 중단 점이 자주 발생하는 경우 프로그램을 상당히 느리게 만듭니다.

마찬가지로 스택의 함수 포인터 만 인쇄하면됩니까?

에 대해서는 GDB가 필요하지 않습니다. 많은 플랫폼에서 프로그램은이 정보를 직접 얻을 수 있습니다 (예 : backtrace 함수에서). 그리고이를 디스크에 기록하십시오. 이는 일반적으로 GDB에서 수행하는 것보다 적어도 100 배 빠릅니다.

는 BT 명령은 항상 상징처럼 많은 정보를 출력 파일 등

당신은 Python unwinder 또는 frame decorator 인쇄를 정확히 제어 할 수 있습니다 라인.

0

strip 도구를 사용하여 디버깅하는 바이너리에서 모든 디버그 정보를 제거 할 수 있습니다.

bt은 기호없이 바이너리에서 빠르게 작동해야합니다. 라인 번호 나 함수 이름을 얻지 않고 원시 메모리 주소 만 bt 출력으로 가져옵니다. 중단 점을 설정하려는 경우 바이너리에 더 이상 디버그 정보가 없으므로 메모리 주소에 설정해야합니다.

디버깅이 끝난 후 호출 계층 구조를 다시 구성하려면 addr2line을 사용할 수 있습니다 (이 질문은 How to use addr2line command in linux 참조). bt 출력에있는 모든 주소를 자동으로 해결하는 방법을 모르겠습니다. 아마 당신은 그것을 하나씩 해결하거나 자동으로 스크립트를 작성해야 할 것입니다. 이제 바이너리는 디버그 심볼을 사용하여 스트립 해제되어야합니다.