当前位置: 首页 > 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 端口...

【Linux】系统初识之冯诺依曼体系结构与操作系统

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.冯诺依曼体系结构 2.操作…...

【PyTorch】模型训练过程优化分析

文章目录 1. 模型训练过程划分1.1. 定义过程1.1.1. 全局参数设置1.1.2. 模型定义 1.2. 数据集加载过程1.2.1. Dataset类&#xff1a;创建数据集1.2.2. Dataloader类&#xff1a;加载数据集 1.3. 训练循环 2. 模型训练过程优化的总体思路2.1. 提升数据从硬盘转移到CPU内存的效率…...

GO -- 设计模式

整篇文档参考了各大神对设计模式的总结&#xff0c;然后整理的一篇关于使用GO来实现设计模式的文档&#xff0c;如有问题&#xff0c;请批评指正&#xff01; 目录 设计模式的优点 设计模式的六大原则 设计模式&#xff0c;即Design Patterns&#xff0c;是指在软件设计…...

angular状态管理方案(ngrx)

完全基于redux的ngrx方案&#xff0c;我们看看在angular中如何实现。通过一个简单的计数器例子梳理下整个流程 一 安装 &#xff1a;npm i ngrx/store 这里特别要注意一点&#xff1a;安装 ngrx/store的时候会出现和angular版本不一致的问题 所以检查一下angular/core的版本…...

EPICS modbus 模块数字量读写练习

本文使用modbus slave软件模拟一个受控的modbus设备&#xff0c;此模拟设备提供如下功能&#xff1a; 1、线圈组1&#xff0c;8个线圈&#xff0c;起始地址为0&#xff0c;数量为8&#xff0c;软件设置如下(功能码1)&#xff0c;用于测试功能码5&#xff0c;一次写一个线圈&am…...

万界星空科技低代码平台:搭建MES系统的优势

低代码MES系统&#xff1a;制造业数字化转型的捷径 随着制造业的数字化转型&#xff0c;企业对生产管理系统的需求逐渐提高。传统的MES系统实施过程复杂、成本高昂&#xff0c;已经无法满足现代企业的快速发展需求。而低代码搭建MES系统的出现&#xff0c;为企业提供了一种高…...

【ArcGIS微课1000例】0078:创建点、线、面数据的最小几何边界

本实例为专栏系统文章:讲述在ArcMap10.6中创建点数据最小几何边界(范围),配套案例数据,持续同步更新! 文章目录 一、工具介绍二、实战演练三、注意事项一、工具介绍 创建包含若干面的要素类,用以表示封闭单个输入要素或成组的输入要素指定的最小边界几何。 工具位于:数…...

五花八门客户问题(BUG) - 数据库索引损坏

问题 曾经有个客户问题&#xff0c;让我们开发不知所措了很久。简单点说就是客户的index周期性的损坏&#xff0c;即使全部重建后经历大约1~2周数据update后也会坏掉。导致的直接结果&#xff1a;select出来的数据不对。问题很严重。 直接看损坏的index文件看不出什么蛛丝马迹…...

mysql select count 非常慢

MySQL select count 性能分析 问题&#xff1a;mysql 在count时发现非常慢 select count(*) from xxx; 无论执行多少次&#xff0c;查询速度基本稳定在10-12秒之间 环境说明 windows11 x64SSD硬盘MySQL8.0.35数据库引擎为InnoDB数据行数不到3万行&#xff0c;但是数据量将近…...

Tomcat管理功能使用

前言 Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能&#xff0c;需要配置管理用户&#xff0c;即配置tomcat-users.xml文件。 &#xff01;&#xff01;&#xff01;注意&#xff1a;测试功…...