커널에서 사용자 공간 프로세스를 역 추적하는 함수를 구현하려고합니다. 이후, 나는 커널에서 일하고 있기 때문에 어떤 라이브러리도 사용할 수 없으며 백 트레이스 기능이 MIPS 아키텍처를 지원하지 않는다. GDB가하는 일을 에뮬레이트 할 수 있을지 궁금합니다. 커널의 버전은 2.6.21입니다.MIPS Linux에서 backtracing 할 때 GDB는 함수의 심볼을 어떻게 찾습니까?
답변
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라는 것을 알 수 있습니다.
두 번째 및 세 번째 방법 커널에서 작업 한 이후로 직접 구현해야합니다.
사실, 나는 세 번째 옵션에 대해 조사를 해왔습니다. 스택이 풀린다고 가정 해 봅시다. 함수의 메모리 주소 만 가지고 있기 때문에 어떻게 함수 이름을 출력해야합니까? – Quincy
@Quincy : 사용자 응용 프로그램의 elf 파일을 구문 분석하면 심볼 테이블이 생성됩니다. 그러나 바이너리가 물리적 메모리에 부분적으로로드 될 수 있기 때문에 커널에서 엘프를 구문 분석하려면 메모리 문제를로드/스왑 할 수있는 페이지 폴트 처리가 필요할 수 있습니다. 코어 덤프 상황에서는 실패 할 수 있습니다. 또는 프로그램에서 기호 테이블을로드 할 수 있습니다. –
@Quincy : 세 번째 방법으로, 주소로 크롤링하는 MIPS에 대해 수행 한 작업을 알고 관련 바이너리 끝을 구문 분석하는 사용자 응용 프로그램으로 보냈습니다. 심볼이지만, 커널의 printk 스타일로 보여주기 위해, 나는 보지 못했다. –
코어 파일은 ELF format입니다. 이 표준은 한 웹 사이트에서 여러 웹 사이트에서 사용할 수 있습니다.
그러나이 파일 형식은 비재 정적입니다. 많은 단점과 비트. 합리적인 사람은 타사 라이브러리를 사용해야합니다. 정말로 그렇게하고 싶다면, libelf와 readelf로 시작하십시오. 행운을 빌어.
나는 단지 명확히하고 싶다. 코어 파일을 사용하고 있지 않습니다. 커널에서 사용자 프로세스가 충돌 할 때 다시 추적하고 싶습니다. – Quincy
- 1. 내 프로세스가 Linux에서 연 파일 핸들은 어떻게 찾습니까?
- 2. GDB는
- 3. GDB는 다른 프로세스의 실행을 어떻게 중단합니까? GDB는 어떻게 작동합니까?
- 4. GDB는
- 5. gdb는 구조체 인쇄를 어떻게 구현합니까?
- 6. 어떻게 mips gnu를 컴파일합니까?
- 7. 구조체의 크기는 어떻게 찾습니까?
- 8. 전화 번호는 어떻게 찾습니까?
- 9. 발신자 기능은 어떻게 찾습니까?
- 10. - 프로세스 ID는 어떻게 찾습니까?
- 11. CoreLocation은 어떻게 장치를 찾습니까?
- 12. RESTful 웹 서비스는 어떻게 찾습니까?
- 13. Solaris에서 gcc가 어떻게 라이브러리를 찾습니까?
- 14. classpath에서 .jar의 리소스를 어떻게 찾습니까?
- 15. ContentResolver는 어떻게 해당 ContentProvider를 찾습니까?
- 16. 셀 내용에서 행을 어떻게 찾습니까?
- 17. jQuery를 사용하여 #을 어떻게 찾습니까?
- 18. "watch"GDB는 어떻게 사용할 수 있습니까?
- 19. javac.exe는 프로그래밍 방식으로 어떻게 찾습니까?
- 20. 디버깅에서 호출하는 방법을 어떻게 찾습니까?
- 21. 메쉬 객체의 높이를 어떻게 찾습니까?
- 22. RichTextBox에서 반복되는 텍스트는 어떻게 찾습니까?
- 23. nosetests는 실행할 테스트를 어떻게 찾습니까?
- 24. 최대 스택 크기는 어떻게 찾습니까?
- 25. dpkg-architecture가 없을 때 linux에서 mips cpu type을 구분하는 방법은 무엇입니까?
- 26. MIPS 어셈블리 소스를 컴파일 할 때 초보자 오류 발생
- 27. 우분투 리눅스에서 .la 파일의 심볼을 어떻게 덤프 할 수 있습니까?
- 28. JNI에서 객체의 필드 설명자는 어떻게 찾습니까?
- 29. PHP에서 심볼을 사용하거나 사용하지 않을 때
- 30. 메서드에서 할당 한 메모리 양은 어떻게 찾습니까?
2.6.21을 의미합니까? 또한 코어 덤프를 사용하지 않는 이유는 무엇입니까? – bdonlan
당신 말이 맞아요. 6.2.21에서 2.6.21으로 변경하십시오. – Quincy
코어 덤프가이 시점에서 생성됩니다. 제가 여기에서 구현하는 것은 향상입니다. "디버깅 경험을 향상시키기 위해서"만약 그렇다면. – Quincy