当前位置: 首页 > news >正文

QEMU环境调试方法

目录

1.如何查看makefile构建过程执行的命令?

2.如何使用GCC生成C程序的宏展开文件?

3.如何在qemu中执行特定的可执行程序?

4.如何在qemu中直接运行可执行程序?

5.如何在qemu中调试某个可执行程序?


本文从调试的角度出发,分享QEMU调试过程中的常见调试方法。


1.如何查看makefile构建过程执行的命令?

为了深入理解ucore操作系统实验的编译链接细节,需要知道makefile在执行的过程中一步一步的指令执行情况。然而大部分的工程中,makefile实际执行情况是没有输出日志的,因此如何产生makefile指令执行的内容十分必要。

make命令的--just-print选项可以让makefile文件组织的工程只输出构建过程中要执行的命令,而不实际执行这些命令。

当上述的命令执行完成后,十分详细的输出的结果如下:

touch -c kern/process/proc.c
make --quiet --no-print-directory "DEFS+=-DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size"
echo + cc kern/init/entry.S
gcc -Ikern/init/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/init/entry.S -o obj/kern/init/entry.o
echo + cc kern/init/init.c
gcc -Ikern/init/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/init/init.c -o obj/kern/init/init.o
echo + cc kern/libs/stdio.c
gcc -Ikern/libs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/libs/stdio.c -o obj/kern/libs/stdio.o
echo + cc kern/libs/readline.c
gcc -Ikern/libs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/libs/readline.c -o obj/kern/libs/readline.o
echo + cc kern/debug/panic.c
gcc -Ikern/debug/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/debug/panic.c -o obj/kern/debug/panic.o
echo + cc kern/debug/kdebug.c
gcc -Ikern/debug/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/debug/kdebug.c -o obj/kern/debug/kdebug.o
echo + cc kern/debug/kmonitor.c
gcc -Ikern/debug/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/debug/kmonitor.c -o obj/kern/debug/kmonitor.o
echo + cc kern/driver/ide.c
gcc -Ikern/driver/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/driver/ide.c -o obj/kern/driver/ide.o
echo + cc kern/driver/clock.c
gcc -Ikern/driver/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/driver/clock.c -o obj/kern/driver/clock.o
echo + cc kern/driver/console.c
gcc -Ikern/driver/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/driver/console.c -o obj/kern/driver/console.o
echo + cc kern/driver/picirq.c
gcc -Ikern/driver/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/driver/picirq.c -o obj/kern/driver/picirq.o
echo + cc kern/driver/intr.c
gcc -Ikern/driver/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/driver/intr.c -o obj/kern/driver/intr.o
echo + cc kern/trap/trap.c
gcc -Ikern/trap/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/trap/trap.c -o obj/kern/trap/trap.o
echo + cc kern/trap/vectors.S
gcc -Ikern/trap/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/trap/vectors.S -o obj/kern/trap/vectors.o
echo + cc kern/trap/trapentry.S
gcc -Ikern/trap/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/trap/trapentry.S -o obj/kern/trap/trapentry.o
echo + cc kern/mm/pmm.c
gcc -Ikern/mm/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/mm/pmm.c -o obj/kern/mm/pmm.o
echo + cc kern/mm/swap_fifo.c
gcc -Ikern/mm/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/mm/swap_fifo.c -o obj/kern/mm/swap_fifo.o
echo + cc kern/mm/vmm.c
gcc -Ikern/mm/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/mm/vmm.c -o obj/kern/mm/vmm.o
echo + cc kern/mm/kmalloc.c
gcc -Ikern/mm/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/mm/kmalloc.c -o obj/kern/mm/kmalloc.o
echo + cc kern/mm/swap.c
gcc -Ikern/mm/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/mm/swap.c -o obj/kern/mm/swap.o
echo + cc kern/mm/default_pmm.c
gcc -Ikern/mm/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/mm/default_pmm.c -o obj/kern/mm/default_pmm.o
echo + cc kern/fs/swapfs.c
gcc -Ikern/fs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/fs/swapfs.c -o obj/kern/fs/swapfs.o
echo + cc kern/process/switch.S
gcc -Ikern/process/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/process/switch.S -o obj/kern/process/switch.o
echo + cc kern/process/entry.S
gcc -Ikern/process/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/process/entry.S -o obj/kern/process/entry.o
echo + cc kern/process/proc.c
gcc -Ikern/process/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/process/proc.c -o obj/kern/process/proc.o
echo + cc kern/schedule/sched.c
gcc -Ikern/schedule/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/schedule/sched.c -o obj/kern/schedule/sched.o
echo + cc kern/syscall/syscall.c
gcc -Ikern/syscall/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -Ikern/libs/ -Ikern/sync/ -Ikern/fs/ -Ikern/process -Ikern/schedule -Ikern/syscall -c kern/syscall/syscall.c -o obj/kern/syscall/syscall.o
echo + cc libs/string.c
gcc -Ilibs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/  -c libs/string.c -o obj/libs/string.o
echo + cc libs/printfmt.c
gcc -Ilibs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/  -c libs/printfmt.c -o obj/libs/printfmt.o
echo + cc libs/hash.c
gcc -Ilibs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/  -c libs/hash.c -o obj/libs/hash.o
echo + cc libs/rand.c
gcc -Ilibs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/  -c libs/rand.c -o obj/libs/rand.o
echo + cc user/hello.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/hello.c -o obj/user/hello.o
echo + cc user/libs/panic.c
gcc -Iuser/libs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/libs/panic.c -o obj/user/libs/panic.o
echo + cc user/libs/syscall.c
gcc -Iuser/libs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/libs/syscall.c -o obj/user/libs/syscall.o
echo + cc user/libs/ulib.c
gcc -Iuser/libs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/libs/ulib.c -o obj/user/libs/ulib.o
echo + cc user/libs/initcode.S
gcc -Iuser/libs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/libs/initcode.S -o obj/user/libs/initcode.o
echo + cc user/libs/stdio.c
gcc -Iuser/libs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/libs/stdio.c -o obj/user/libs/stdio.o
echo + cc user/libs/umain.c
gcc -Iuser/libs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/libs/umain.c -o obj/user/libs/umain.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_hello.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/hello.o
objdump -S obj/__user_hello.out > obj/user/hello.asm
objdump -t obj/__user_hello.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/hello.sym
echo + cc user/badarg.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/badarg.c -o obj/user/badarg.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_badarg.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/badarg.o
objdump -S obj/__user_badarg.out > obj/user/badarg.asm
objdump -t obj/__user_badarg.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/badarg.sym
echo + cc user/forktree.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/forktree.c -o obj/user/forktree.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_forktree.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/forktree.o
objdump -S obj/__user_forktree.out > obj/user/forktree.asm
objdump -t obj/__user_forktree.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/forktree.sym
echo + cc user/badsegment.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/badsegment.c -o obj/user/badsegment.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_badsegment.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/badsegment.o
objdump -S obj/__user_badsegment.out > obj/user/badsegment.asm
objdump -t obj/__user_badsegment.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/badsegment.sym
echo + cc user/faultread.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/faultread.c -o obj/user/faultread.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_faultread.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/faultread.o
objdump -S obj/__user_faultread.out > obj/user/faultread.asm
objdump -t obj/__user_faultread.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/faultread.sym
echo + cc user/pgdir.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/pgdir.c -o obj/user/pgdir.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_pgdir.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/pgdir.o
objdump -S obj/__user_pgdir.out > obj/user/pgdir.asm
objdump -t obj/__user_pgdir.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/pgdir.sym
echo + cc user/exit.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/exit.c -o obj/user/exit.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_exit.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/exit.o
objdump -S obj/__user_exit.out > obj/user/exit.asm
objdump -t obj/__user_exit.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/exit.sym
echo + cc user/softint.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/softint.c -o obj/user/softint.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_softint.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/softint.o
objdump -S obj/__user_softint.out > obj/user/softint.asm
objdump -t obj/__user_softint.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/softint.sym
echo + cc user/waitkill.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/waitkill.c -o obj/user/waitkill.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_waitkill.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/waitkill.o
objdump -S obj/__user_waitkill.out > obj/user/waitkill.asm
objdump -t obj/__user_waitkill.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/waitkill.sym
echo + cc user/spin.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/spin.c -o obj/user/spin.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_spin.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/spin.o
objdump -S obj/__user_spin.out > obj/user/spin.asm
objdump -t obj/__user_spin.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/spin.sym
echo + cc user/yield.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/yield.c -o obj/user/yield.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_yield.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/yield.o
objdump -S obj/__user_yield.out > obj/user/yield.asm
objdump -t obj/__user_yield.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/yield.sym
echo + cc user/divzero.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/divzero.c -o obj/user/divzero.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_divzero.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/divzero.o
objdump -S obj/__user_divzero.out > obj/user/divzero.asm
objdump -t obj/__user_divzero.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/divzero.sym
echo + cc user/testbss.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/testbss.c -o obj/user/testbss.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_testbss.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/testbss.o
objdump -S obj/__user_testbss.out > obj/user/testbss.asm
objdump -t obj/__user_testbss.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/testbss.sym
echo + cc user/faultreadkernel.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/faultreadkernel.c -o obj/user/faultreadkernel.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_faultreadkernel.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/faultreadkernel.o
objdump -S obj/__user_faultreadkernel.out > obj/user/faultreadkernel.asm
objdump -t obj/__user_faultreadkernel.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/faultreadkernel.sym
echo + cc user/forktest.c
gcc -Iuser/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Iuser/include/ -Iuser/libs/ -c user/forktest.c -o obj/user/forktest.o
ld -m    elf_i386 -nostdlib -T tools/user.ld -o obj/__user_forktest.out  obj/user/libs/panic.o obj/user/libs/syscall.o obj/user/libs/ulib.o obj/user/libs/initcode.o obj/user/libs/stdio.o obj/user/libs/umain.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o obj/user/forktest.o
objdump -S obj/__user_forktest.out > obj/user/forktest.asm
objdump -t obj/__user_forktest.out | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/user/forktest.sym
mkdir -p bin/
echo + ld bin/kernel
ld -m    elf_i386 -nostdlib -T tools/kernel.ld -o bin/kernel  obj/kern/init/entry.o obj/kern/init/init.o obj/kern/libs/stdio.o obj/kern/libs/readline.o obj/kern/debug/panic.o obj/kern/debug/kdebug.o obj/kern/debug/kmonitor.o obj/kern/driver/ide.o obj/kern/driver/clock.o obj/kern/driver/console.o obj/kern/driver/picirq.o obj/kern/driver/intr.o obj/kern/trap/trap.o obj/kern/trap/vectors.o obj/kern/trap/trapentry.o obj/kern/mm/pmm.o obj/kern/mm/swap_fifo.o obj/kern/mm/vmm.o obj/kern/mm/kmalloc.o obj/kern/mm/swap.o obj/kern/mm/default_pmm.o obj/kern/fs/swapfs.o obj/kern/process/switch.o obj/kern/process/entry.o obj/kern/process/proc.o obj/kern/schedule/sched.o obj/kern/syscall/syscall.o  obj/libs/string.o obj/libs/printfmt.o obj/libs/hash.o obj/libs/rand.o -b binary  obj/__user_hello.out obj/__user_badarg.out obj/__user_forktree.out obj/__user_badsegment.out obj/__user_faultread.out obj/__user_pgdir.out obj/__user_exit.out obj/__user_softint.out obj/__user_waitkill.out obj/__user_spin.out obj/__user_yield.out obj/__user_divzero.out obj/__user_testbss.out obj/__user_faultreadkernel.out obj/__user_forktest.out
objdump -S bin/kernel > obj/kernel.asm
objdump -t bin/kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > obj/kernel.sym
echo + cc boot/bootasm.S
gcc -Iboot/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Os -nostdinc -c boot/bootasm.S -o obj/boot/bootasm.o
echo + cc boot/bootmain.c
gcc -Iboot/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size -fno-stack-protector -Ilibs/ -Os -nostdinc -c boot/bootmain.c -o obj/boot/bootmain.o
echo + cc tools/sign.c
gcc -Itools/ -g -Wall -O2 -c tools/sign.c -o obj/sign/tools/sign.o
gcc -g -Wall -O2 obj/sign/tools/sign.o -o bin/sign
echo + ld bin/bootblock
ld -m    elf_i386 -nostdlib -N -T tools/boot.ld obj/boot/bootasm.o obj/boot/bootmain.o -o obj/bootblock.o
objdump -S obj/bootblock.o > obj/bootblock.asm
objcopy -S -O binary obj/bootblock.o obj/bootblock.out
bin/sign obj/bootblock.out bin/bootblock
dd if=/dev/zero of=bin/ucore.img count=10000
dd if=bin/bootblock of=bin/ucore.img conv=notrunc
dd if=bin/kernel of=bin/ucore.img seek=1 conv=notrunc
dd if=/dev/zero of=bin/swap.img bs=1024k count=128

2.如何使用GCC生成C程序的宏展开文件?

在ucore调试的过程中,会遇到多层嵌套的宏定义,此时理解起来十分的困难,那么知道宏展开的结果十分重要(例如以下test.c的宏展开)。

//test.c文件
// kernel_execve - do SYS_exec syscall to exec a user program called by user_main kernel_thread
static int
kernel_execve(const char *name, unsigned char *binary, size_t size) {int ret, len = strlen(name);asm volatile ("int %1;": "=a" (ret): "i" (T_SYSCALL), "0" (SYS_exec), "d" (name), "c" (len), "b" (binary), "D" (size): "memory");return ret;
}#define __KERNEL_EXECVE(name, binary, size) ({                          \cprintf("kernel_execve: pid = %d, name = \"%s\".\n",        \current->pid, name);                                \kernel_execve(name, binary, (size_t)(size));                \})#define KERNEL_EXECVE(x) ({                                             \extern unsigned char _binary_obj___user_##x##_out_start[],  \_binary_obj___user_##x##_out_size[];                    \__KERNEL_EXECVE(#x, _binary_obj___user_##x##_out_start,     \_binary_obj___user_##x##_out_size);         \})#define __KERNEL_EXECVE2(x, xstart, xsize) ({                           \extern unsigned char xstart[], xsize[];                     \__KERNEL_EXECVE(#x, xstart, (size_t)xsize);                 \})#define KERNEL_EXECVE2(x, xstart, xsize)        __KERNEL_EXECVE2(x, xstart, xsize)// user_main - kernel thread used to exec a user program
static int
user_main(void *arg) {
#ifdef TESTKERNEL_EXECVE2(TEST, TESTSTART, TESTSIZE);
#elseKERNEL_EXECVE(exit);
#endifpanic("user_main execve failed.\n");
}

在上面的代码中,使用的宏定义如下:

TEST=hello
TESTSTART=_binary_obj___user_hello_out_start
TESTSIZE=_binary_obj___user_hello_out_size

此时需要gcc的命令输出C代码的预处理结果,这个命令如下:

gcc -E -DTEST=hello -DTESTSTART=_binary_obj___user_hello_out_start -DTESTSIZE=_binary_obj___user_hello_out_size test.c -o test.i

最终宏展开的详细输出的结果如下:

# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "test.c"static int
kernel_execve(const char *name, unsigned char *binary, size_t size) {int ret, len = strlen(name);asm volatile ("int %1;": "=a" (ret): "i" (T_SYSCALL), "0" (SYS_exec), "d" (name), "c" (len), "b" (binary), "D" (size): "memory");return ret;
}
# 35 "test.c"
static int
user_main(void *arg) {({ extern unsigned char _binary_obj___user_hello_out_start[], _binary_obj___user_hello_out_size[]; ({ cprintf("kernel_execve: pid = %d, name = \"%s\".\n", current->pid, 		"hello"); kernel_execve("hello", _binary_obj___user_hello_out_start, (size_t)((size_t)_binary_obj___user_hello_out_size)); }); 
});panic("user_main execve failed.\n");
}

在上面的代码中,变量_binary_obj___user_hello_out_start是外部变量,只有声明(说明变量的性质,但并不分配存储单元),没有定义(表示创建变量或分配存储单元),那在哪里定义的呢?

这是由于gcc指令中-D的宏(-Dmacro[=defn]),因此可以理解_binary_obj___user_hello_out_start在gcc命令表示成定义,而不是声明。于是上述的代码是可以生成可执行文件的。

-D macro=string,等价于在头文件中定义:#define   macro   string。

为了验证相当于#define macro string,下面的Qt代码能打印输出。

#include <stdio.h>#include <stdint.h>#define TEST hello
#define TESTSTART _binary_obj___user_hello_out_start
#define TESTSIZE _binary_obj___user_hello_out_size#define __KERNEL_EXECVE(name, binary, size) ({                          \printf("kernel_execve: pid = %d, name = \"%s\".\n",        \1, name);                                \})#define KERNEL_EXECVE(x) ({                                             \extern unsigned char _binary_obj___user_##x##_out_start[],  \_binary_obj___user_##x##_out_size[];                    \__KERNEL_EXECVE(#x, _binary_obj___user_##x##_out_start,     \_binary_obj___user_##x##_out_size);         \})#define __KERNEL_EXECVE2(TEST, TESTSTART, TESTSIZE) ({                           \extern unsigned char xstart[], xsize[];                     \__KERNEL_EXECVE("hello", _binary_obj___user_hello_out_start, (size_t)_binary_obj___user_hello_out_size);                 \})#define KERNEL_EXECVE2(TEST, TESTSTART, TESTSIZE)        __KERNEL_EXECVE2(TEST, TESTSTART, TESTSIZE)// user_main - kernel thread used to exec a user program
static int
user_main(void *arg) {
#ifdef TESTKERNEL_EXECVE2(TEST, TESTSTART, TESTSIZE);
#elseKERNEL_EXECVE(exit);
#endifprintf("user_main execve failed.\n");
}int main()
{user_main(NULL);return 0;
}

3.如何在qemu中执行特定的可执行程序?

在Lab8中,用户态编译了多个进程,如hello、badarg,如何在文件系统中执行某个单独的应用程序,是一个关键的问题。

首先,执行make clean,这一步将清空Lab8工程所有的编译输出结果。

然后,执行make ,这一步将生成ucore镜像以及应用程序。

然后,执行make qemu,这一步将启动qemu虚拟机。

然后,在qemu输入输出界面,按下回车键进入shell界面

最后,在shell的终端界面中执行sfs_filetest1

4.如何在qemu中直接运行可执行程序?

在第3步中,在qemu虚拟机中执行应用程序,这种方式效率低。而在qemu中编译、链接、执行某个应用程序的方式效率高,且更加有益于单步调试。

首先,执行make run-%命令,执行某个程序。

最后,在终端中查看运行结果。

5.如何在qemu中调试某个可执行程序?

首先,执行make build-%,编译输出可执行程序。

然后,执行make debug,单步调试目标。

最后,设置断点,单步调试内核。

相关文章:

QEMU环境调试方法

目录 1.如何查看makefile构建过程执行的命令&#xff1f; 2.如何使用GCC生成C程序的宏展开文件&#xff1f; 3.如何在qemu中执行特定的可执行程序&#xff1f; 4.如何在qemu中直接运行可执行程序&#xff1f; 5.如何在qemu中调试某个可执行程序&#xff1f; 本文从调试的角…...

京东数据运营(京东API接口):10月投影仪店铺数据分析

鲸参谋监测的京东平台10月份投影仪市场销售数据已出炉&#xff01; 10月份&#xff0c;环同比来看&#xff0c;投影仪市场销售均上涨。鲸参谋数据显示&#xff0c;今年10月&#xff0c;京东平台投影仪的销量为16万&#xff0c;环比增长约22%&#xff0c;同比增长约8%&#xff1…...

Aloha 机械臂的学习记录2——AWE:AWE + ACT

继续下一个阶段&#xff1a; Train policy python act/imitate_episodes.py \ --task_name [TASK] \ --ckpt_dir data/outputs/act_ckpt/[TASK]_waypoint \ --policy_class ACT --kl_weight 10 --chunk_size 50 --hidden_dim 512 --batch_size 8 --dim_feedforward 3200 \ --n…...

Spring Boot 项目的创建、配置文件、日志

文章目录 Spring Boot 优点创建 Spring Boot 项目创建项目认识目录网页创建&#xff08;了解&#xff09; 约定大于配置Spring Boot 配置文件配置文件格式读取配置项properties 配置文件yml 配置文件基本语法进阶语法配置对象配置集合yml 设置不同环境的配置文件 Spring Boot 日…...

MySQL:drop、delete与truncate区别

一、用法不同 1、drop(丢弃数据): drop table 表名 &#xff0c;直接将表都删除掉&#xff0c;在删除表的时候使用。 2、truncate (清空数据) : truncate table 表名 &#xff0c;只删除表中的数据&#xff0c;再插入数据的时候自增长 id 又从 1 开始&#xff0c;在清空表中数…...

2024年顶级的9个 Android 数据恢复工具(免费和付费)

不同的事情可能会损坏您的Android手机并导致您丢失数据。但大多数时候&#xff0c;您可以使用取证工具恢复部分或全部文件。 问题可能来自手机的物理损坏、磁盘的逻辑故障、完整的系统擦除&#xff0c;或者只是简单的粗心大意。 但是&#xff0c;无论数据丢失的原因是什么&am…...

c# Aspose.Cells 导出Excel表格 使用随记

/// <summary>/// 导出Excel表格/// </summary>/// <param name"list">数据集合</param>/// <param name"header">数据表头</param>/// <param name"sumColumn">求和列</param>/// <param n…...

SAP UI5 walkthrough step3 Controls

在上一步&#xff0c;我们是直接用index.html 中的body 里面的DIVision去输出 hello world&#xff0c; 在这个章节&#xff0c;我们将用SAP UI5 的标准控件 sap/m/Text 首先&#xff0c;我们去修改 webapp/index.html <!DOCTYPE html> <html> <head><…...

【分布式微服务专题】从单体到分布式(一、SpringCloud项目初步升级)

目录 前言阅读对象阅读导航前置知识笔记正文一、单体服务介绍二、服务拆分三、分布式微服务升级前的思考3.1 关于SpringBoot/SpringCloud的思考【有点门槛】 四、SpringCloud升级整合4.1 新建父子项目 学习总结感谢 前言 从本节课开始&#xff0c;我将自己手写一个基于SpringC…...

python安装与工具PyCharm

摘要&#xff1a; 周末闲来无事学习一下python&#xff01;不是你菜鸡&#xff0c;只不过是对手太强了&#xff01;所以你要不断努力&#xff0c;去追求更高的未来&#xff01;下面先了解python与环境的安装与工具的配置&#xff01; python安装&#xff1a; 官网 进入官网下载…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机图像保存到电脑内存的技术背景代码分析注册SDK回调函数BufferEvent声明可以存储相机图像的内存序列和名称在图像回调函数中将图像保存在内存序…...

iOS 防截屏方法(一)

利用UITextField的安全输入secureTextEntry来实现防截屏效果&#xff0c;上代码&#xff1a; // 将 textField 添加到父视图UITextField *textField [[UITextField alloc] init];textField.backgroundColor [UIColor whiteColor];textField.secureTextEntry YES;[self.view …...

【SpringBoot篇】5种类型参数传递json数据传参的操作

&#x1f38a;专栏【SpringBoot】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f33a;普通参数&#x1f33a;POJO参数&#x1f33a;嵌套…...

Mac系统升级node.js版本和npm版本

升级node.js版本 第一步&#xff1a;查询当前node.js版本 node -v 第二步&#xff1a;清除node.js的缓存 sudo npm cache clean -f 第三步&#xff1a;验证缓存是否清空 npm cache verify 第四步&#xff1a;安装n工具&#xff0c;n工具是专门用于管理node.js版本的工具…...

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端 目 录 1、产品规格 2、接口使用 2.1、侧面接口功能 2.2、背面接口功能 2.3、面板接口功能 3、功能使用 1、产品规格 输入电源&#xff1a; 12V&#xff5e;24V的直流电源 网络接口&am…...

智能优化算法应用:基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜉蝣算法4.实验参数设定5.算法结果6.参考文献7.MA…...

pymysql报错: unable to rollback、Already closed

参考&#xff1a; https://www.coder.work/article/4516746 https://www.cnblogs.com/leijiangtao/p/11882107.html https://stackoverflow.com/questions/55116007/pymysql-query-unable-to-rollback unable to rollback处理&#xff1a; # 关闭光标对象 cursor.close() # 关…...

[Linux] Web基础知识与http协议

一、HTML 1.1 HTML 的概念 HTML被称为超文本标记语言。 它是规范和标准. 它通过标记符号来标记网页中出现的各个部分。网页文件本身就是一种文本文件。 通过向文本文件添加标记&#xff0c;您可以告诉浏览器如何显示其中的内容。 HTML命令可以描述文本、图形、动画、声音、表格…...

2020年第九届数学建模国际赛小美赛B题血氧饱和度的变异性解题全过程文档及程序

2020年第九届数学建模国际赛小美赛 B题 血氧饱和度的变异性 原题再现&#xff1a; 脉搏血氧饱和度是监测患者血氧饱和度的常规方法。在连续监测期间&#xff0c;我们希望能够使用模型描述血氧饱和度的模式。   我们有36名受试者的数据&#xff0c;每个受试者以1 Hz的频率连…...

【Flink on k8s】- 11 - 使用 Flink kubernetes operator 运行 Flink 作业

目录 1、创建本地镜像库 1.1 拉取私人仓库镜像 1.2 运行 1.3 本地浏览器访问 5000 端口...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...