2009-06-27 2 views
2

커널에서 사용자 공간 프로세스를 역 추적하는 함수를 구현하려고합니다. 이후, 나는 커널에서 일하고 있기 때문에 어떤 라이브러리도 사용할 수 없으며 백 트레이스 기능이 MIPS 아키텍처를 지원하지 않는다. GDB가하는 일을 에뮬레이트 할 수 있을지 궁금합니다. 커널의 버전은 2.6.21입니다.MIPS Linux에서 backtracing 할 때 GDB는 함수의 심볼을 어떻게 찾습니까?

+0

2.6.21을 의미합니까? 또한 코어 덤프를 사용하지 않는 이유는 무엇입니까? – bdonlan

+0

당신 말이 맞아요. 6.2.21에서 2.6.21으로 변경하십시오. – Quincy

+0

코어 덤프가이 시점에서 생성됩니다. 제가 여기에서 구현하는 것은 향상입니다. "디버깅 경험을 향상시키기 위해서"만약 그렇다면. – Quincy

답변

1

oprofile의 구현을 참조 할 수 있다고 생각합니다.

Oprofile back trace 정보를 얻기 위해 frame-pointer를 사용하므로 사용자 공간 응용 프로그램과 관련 라이브러리가 모두 프레임 포인터를 사용하도록 설정되어 있어야합니다 ("-fno-omit-frame-pointer"옵션).

또 다른 방법은 사용자 응용 프로그램 디버그 정보]이 포함 된 경우는 각각을 찾을 수 있도록, 당신의 DWARF 호출 프레임 정보]는 함수가 호출 방법에 대한 충분한 정보]와 디버거를 proides, 사용자 응용 프로그램의 DWARF 정보]를 확인해야 할 수도 있습니다 함수에 대한 인수, 현재 호출 프레임을 찾고 호출하는 호출 프레임의 위치를 ​​찾습니다.

"프레임 포인터"지원 또는 디버그 정보없이 백 트레이스 정보를 간단하게 크롤링하려면 사용자 응용 프로그램의 mips 명령을 확인하고 하위 컨텍스트 (SP, IP, RP)를 반복해야합니다. mips ABI 사양에 따라 상위 컨텍스트 (SP, IP, RP)를 얻으십시오. 메모리에서 많은 명령어를 디스 어셈블해야하므로 약간 복잡하고 시간이 오래 걸리지 만 작동하지는 않습니다. 예를 들어, 많은 라우터의 경우 구걸시 "sp, sp, -32"명령을 추가하면 parent'sp가 현재 sp보다 32라는 것을 알 수 있습니다.

두 번째 및 세 번째 방법 커널에서 작업 한 이후로 직접 ​​구현해야합니다.

+0

사실, 나는 세 번째 옵션에 대해 조사를 해왔습니다. 스택이 풀린다고 가정 해 봅시다. 함수의 메모리 주소 만 가지고 있기 때문에 어떻게 함수 이름을 출력해야합니까? – Quincy

+0

@Quincy : 사용자 응용 프로그램의 elf 파일을 구문 분석하면 심볼 테이블이 생성됩니다. 그러나 바이너리가 물리적 메모리에 부분적으로로드 될 수 있기 때문에 커널에서 엘프를 구문 분석하려면 메모리 문제를로드/스왑 할 수있는 페이지 폴트 처리가 필요할 수 있습니다. 코어 덤프 상황에서는 실패 할 수 있습니다. 또는 프로그램에서 기호 테이블을로드 할 수 있습니다. –

+0

@Quincy : 세 번째 방법으로, 주소로 크롤링하는 MIPS에 대해 수행 한 작업을 알고 관련 바이너리 끝을 구문 분석하는 사용자 응용 프로그램으로 보냈습니다. 심볼이지만, 커널의 printk 스타일로 보여주기 위해, 나는 보지 못했다. –

1

코어 파일은 ELF format입니다. 이 표준은 한 웹 사이트에서 여러 웹 사이트에서 사용할 수 있습니다.

그러나이 파일 형식은 비재 정적입니다. 많은 단점과 비트. 합리적인 사람은 타사 라이브러리를 사용해야합니다. 정말로 그렇게하고 싶다면, libelf와 readelf로 시작하십시오. 행운을 빌어.

+0

나는 단지 명확히하고 싶다. 코어 파일을 사용하고 있지 않습니다. 커널에서 사용자 프로세스가 충돌 할 때 다시 추적하고 싶습니다. – Quincy

관련 문제