리눅스 커널 소스 레벨 디버깅

도구를 읽는 리눅스 커널 소스 코드

      리눅스에서 물론 창문을 선호하는 소스 통찰력의하지만 정말 좋은 도구는 어떤 소스 통찰력을 없지만, 대안이 많이있다,하지만 느낌 절대적으로 어떤 사람들이 어떤 사람들이 와인을 선택하거나, + ctags를 + cscope의 조합을 정력 선택합니다 정력에 대한 코드 리더를위한 과정의 소스 통찰력을 선택하거나 navigatror, ​​+ ctags를 + cscope의 조합이 꽤 좋은 옵션입니다,하지만 난 일식을 사용하는 경우, 도구가 할 읽기 소스 코드와 리눅스 환경과 개인적인 느낌을 일식 훨씬 쉽게의 조합보다 더 정력 + ctags를 + cscope를.

     다음 구성은 일식 리눅스 환경 계획을 장착 :

      다운로드 일식 : http://eclipse.org/downloads/?osType=linux

      Eclipse 환경 설정 프로그램 : http://forum.ubuntu.org.cn/viewtopic.php?t=183803

두 일식 + QEMU 수 리눅스 소스 코드 컴파일러와 디버거

       처음 커널 사용 QEMU + 통찰력 또는 QEMU + DDD, insgiht보다 더 많은 인터페이스에 비해 사람의 조합을 디버깅하지만 10.04 우분투 버전 이상, 인사이트에 대한 기본 지원을 삭제 만 소스 코드 컴파일러 설치를 다운로드 할 수 있습니다 통찰력, 과 통찰력 업데이트 할 매우 느립니다. 긴 시간 전에 누군가가 리눅스 커널 소스 코드 컴파일러와 디버깅 일식 + QEMU를 수행하는 데, 나는 마침내 모든 후, 디버거의 일식은 매우 강력하다, 시도 할 시간을 훈제했다.

      도구의 조합 :  C / C ++ 리눅스 개발자를위한 이클립스 IDE   +는 QEMU-0.12.3은 (바람직 평방 미터로, 불행하게도 컴퓨터가 너무 오래되어 하드웨어 가상화를 지원하지 않습니다)

 

1. 먼저 우리는 내가 리눅스로 들어가십시오를 선택한 커널 소스 www.kernel.org을 다운로드해야합니다. 나는 터미널에서 다음 명령을 입력 내 홈 디렉토리에 다운로드합니다.

$ 카드뮴 (뒷면의 홈 디렉토리)

$ 타르 XF 리눅스로 들어가십시오 (소스 추출)

$에서 mkdir 리눅스 2.6.32-OBJ (커널 컴파일 된 오브젝트 파일 출력 디렉토리를 생성합니다)

$ 카드뮴 리눅스 2.6.32 (커널 소스 트리의 루트 디렉토리)

$ 만들기 O = ~ / 리눅스 2.6.28-OBJ menuconfig를 (여기 우리가 커널을 구성 할, 커널 구성 파일 ~ / 리눅스 2.6.32-OBJ 디렉토리의 .config를 생성)

$ 메이크업의 mrproper 

 

2. 다음 열려 elicpse을 우리는 환영 화면이 때 처음 열 때,

우리는 시작 화면을 해제 할 수있는 권리에 워크 벤치 이미지를 클릭. 이클립스 CDT는 아주 강한 C / C ++ IDE, 그것은 자동으로 기본 해상도 프로젝트 소스 코드와 프로젝트를 컴파일하고 지능형 메시지를 생성한다. 우리가 커널 프로세스가 일시적으로 이러한 기능을 사용하지 않습니다 디버깅하기 때문에 그러나, 그래서 당신은 그들을 닫으려면.

처음에 우리는 창 -에 갔다> 환경 설정 -> 일반 -> 작업 공간 빌드가 자동으로 옵션이 제거됩니다.

 그런 다음 창 -> 환경 설정 -> C / C ++로 -> 인덱서, 아니 인덱서에 빠른 기본 C / C ++ 인덱서.

 그리고 우리는 새로운 프로젝트를 생성하기 시작했다.

 메뉴에서 파일 -> 새로 만들기 -> 프로젝트 ... -> C / C ++ -> C 프로젝트 및 다음을 클릭합니다.

 그런 다음 대화 상자가, 리눅스 커널과 프로젝트 이름 열에서 프로젝트 이름을 입력 나타납니다. 그런 다음 사용 기본 위치 옵션 선택을 해제 할 수 있습니다. 위치에 컬럼 작성은 커널 소스 경로를 추출 하였다. 프로젝트 유형을 선택 메이크 프로젝트 -> 빈 프로젝트. 아래와 같이 리눅스 GCC 툴체인은 최종 결과를 선택 :

 

그런 다음 다음 버튼을 클릭 한 다음 대화 상자가 나타납니다. 이번 프로젝트의 기본 구성은 완전히 우리의 요구 사항을 충족하지 않는 때문이다. 그래서 우리는 고급 설정 버튼은 프로젝트 설정 대화 상자를 엽니 클릭합니다. 우리는 바로 우리가 설정 탭 빌더를 사용하여 기본 빌드 명령이 해제 확인 할 페이지의 해당에서 C / C ++ 빌드 옵션의 왼쪽을 선택하고 만들 수있는 새로운 빌드 명령을 지정 O = / 가정 / XXX / . 리눅스 2.6.28-OBJ 다음 파일 시스템에서 빌드 위치를 클릭 ... /home/xxx/linux-2.6.28-obj 최종 결과에 대한 OBJ 파일 출력 디렉토리를 변경하는 버튼을 아래와 같이 :

동작 옵션은 다음 공간에서 빌드 모든 (증분 빌드)을 변경, 페이지를 클릭 한 다음 변경 (기본 명령 대상 명확한 커널 OBJ 파일)을 mrproper 깨끗 될 것입니다. 어떻게 든 후 아래와 같이 :

이 시간 당신은 커널을 컴파일 할 수 있습니다. Ctrl 키 + B는 커널 컴파일을 시작합니다.

 

커널 컴파일. /home/xxx/linux-2.6.32-obj/arch/x86/boot/ bzImage 행에서 많은 커널 이미지에 따라 생성.

 우리의 xterm에서 실행되는 가상 머신을 QEMU이 시점에서 다음과 같이 명령 줄은 다음과 같습니다

$ QEMU -s -S -hda ~ / 리눅스 0.2.img -kernel /home/xxx/linux-2.6.32-obj/arch/x86/boot/bzImage -append 루트 =는 / dev / HDA

 我解释一下这个命令行上的参数。

 -s 选项表示我们运行虚拟机时将1234端口开启成调试端口,供eclipse网络调试时使用

-S 选项表示我们启动虚拟机时要“冻住”虚拟机,等待调试器发出继续运行的命令。

-hda ~/linux-0.2.img 表示我们要运行时的硬盘 (这个文件可以在http://wiki.qemu.org/Download下到)
-kernel /home/xxx/linux-2.6.32-obj/arch/x86/boot/bzImage 表示我们要调试的内核镜像

-append root=/dev/hda 表示我们要传递给内核的参数(这里你可能感觉有点奇怪为啥是/dev/hda而不是/dev/hda1或是/dev/hda2呢?因为这个镜像仅仅是一个分区的二进制镜像,不是整个硬盘的镜像)

启动后,你会看到屏幕黑黑的啥也没有。因为我们指定了-S参数把虚拟机给“冻”住了。

 继续回到eclipse中,这时候我们在菜单中选择Run -> Debug Configurations ,这时候打开一个配置页面。然后我们在C/C++ Application上双击鼠标,这时在右侧的页面弹出了debug配置选项,然后我们在project一栏选择 linux-kernel ,在下面的C/C++ Application中填入/home/xxx/linux-2.6.32-obj/vmlinux,如下图所示:

然后我们单击Debugger选项页,将Debugger改为 GdbServer Debugger . 将Stop on startup at 改为start_kernel,将Connection子选项页下的Type改为TCP将Port number改为1234,最终如下图所示:

 然后单击Debug按钮开始调试!这时候Eclipse会提示我们切换 Perspective ,选择是,不再提示。

这时候就开始调试内核,而且是源码级的调试!如下图:

总结:不知道是我机器烂还是咋地,eclipse+qemu虽然调试信息更加详细,eclipse的调试器也足够强大,但是每次调试前都要进行编译,时间太久了,等不起!! 哪位大侠可知道如何每次调试不要编译!!

추천

출처www.cnblogs.com/cfas/p/12286080.html