gcc --version sudo apt-get install gcc-snapshot -y sudo apt install gcc-9 g++-9 -y sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9 gcc --version # 下载解压 gdb cd /root #wget https://mirror.bjtu.edu.cn/gnu/g...
{% post_link Linux/vm/'qemu gdb lx-symbols Python Exception <class ‘gdb.MemoryError‘> Cannot access memory at address 0xfff' %} 编译内核模块 Makefile里加上 ccflags-y += -g -DDEBUG -O1 不能用-O0,可能会报错。 配置gdb 在~/.gdbinit里加上 add-auto-load-safe-path /full_path_to_k...
gdb-x command.gdb 就能设置断点并启动虚拟机,这个时候,gdb调试的就是QEMU自身了。 关于GDB的调试命令,有详细的介绍,可以上网慢慢学。可以参考:https://docs.dragonos.org/zh-cn/latest/kernel/debug/debug-kernel-with-gdb.html 常用的方法 起始断点与普通断点 调试的时候,我们可以一次性设置很多断点。断点按照用...
就不用把大文件放到虚拟机了,速度会受影响。 左边启动虚拟机,等待调试。右边打开gdb调试器,从内核源码里面读取符号。 用gdb连接到qume虚拟机。 target remote localhost:1234 把busybox可执行文件读进来,后面是起始地址。 加断点,这是执行命令解释器时候的入口。 ash_main 再加ls命令的断点。如下图 右侧执行c,左侧...
如果使用了-enable-kvm,就必须要设置硬件断点,gdb命令为hbreak,缩写为hb。注意硬件断点需要硬件支持,所以不一定有效。 如果是在内核模块里的断点,还需要按以下顺序进行操作: 编译带有debug symbol的内核模块 ccflags-y += -g -DDEBUG -O1 不能用-O0,可能会报错。
01 以DEBUG方式编译OpenSBI 由于上次编译命令没有加DEBUG=1参数,所以为了调试,需要重新编译: make clean make CROSS_COMPILE=riscv64-linux-gnu- PLATFORM=generic DEBUG=1 all -j2 02 安装gdb 直接安装gdb-multiarch即可: sudo apt install gdb-multiarch -y ...
* 或者是当前处于内核态,无法debug用户态的程序(这个讲不通因为某些用户程序却可以正常debug) * 所以最有可能的答案应该就是gdb是根据elf文件(也即_sleep)里面的符号来判断你打断点的地址,就是监控pc指针,一旦pc指针到达对应地址就触发断点。 也可以理解为该程序(sleep)没有被加载,没有被映射到对应的虚拟内存上,...
grepCONFIG_DEBUG_INFO.configCONFIG_DEBUG_INFO=y 编译内核 代码语言:javascript 代码运行次数:0 运行 AI代码解释 make bzimage-j4 编译完成后,会在当前目录下生成vmlinux,这个在 gdb 的时候需要加载,用于读取 symbol 符号信息,包含了所有调试信息,所以比较大。
按照上图的方式,vmlinux是带符号信息的未压缩的内核,gdb启动之后,运行target remote localhost:1234连接qemu中-s指定的端口。接下来就可以设置断点了,后面的就和调试用户态程序的方法是一样的了。 其它 mount文件系统 通过qemu启动的系统,往往都没有挂载文件系统,我们可以手动的mount ...