高級操作系統實驗2-進程調度與切換分析(2)

来源:https://www.cnblogs.com/ppbb/archive/2020/03/20/12528394.html
-Advertisement-
Play Games

先編寫應用程式,使之包含三個進程,分別輸出三個字母,不知道從何下手,先研究一下上課老師講的例子,代碼如下 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 5 void loop(){ 6 while(1); 7 ...


 先編寫應用程式,使之包含三個進程,分別輸出三個字母,不知道從何下手,先研究一下上課老師講的例子,代碼如下

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <pthread.h>
 4 
 5 void loop(){
 6   while(1);
 7 }
 8 
 9 void *p1(){
10   printf("thread-1 starting\n");
11   loop();
12 }
13 
14 void *p2(){
15   printf("thread-2 starting\n");
16   loop();
17 }
18 
19 void main(){
20   int pid1, pid2;
21   pthread_t t1,t2;
22   void *thread_result;
23 
24   printf("main starting\n");
25 
26   if (!(pid1 = fork())){
27     printf("child-1 starting\n");
28     loop();
29     exit(0);
30   }
31 
32   if (!(pid2 = fork())){
33     printf("child-2 starting\n");
34     loop();
35     exit(0);
36   }
37 
38   pthread_create(&t1, NULL, p1, NULL);
39   pthread_create(&t2, NULL, p2, NULL);
40   
41   pthread_join(t1, &thread_result);
42   pthread_join(t2, &thread_result);
43 
44   int status;
45   waitpid(pid1, &status, 0);
46   waitpid(pid2, &status, 0);
47   printf("main exiting\n");
48   exit(0);
49 }
View Code

運行結果如下

1 / # tmp/do-fork &
2 main starting
3 child-1 starting
4 child-2 starting
5 thread-1 starting
6 thread-2 starting
7 / #

各種問題來了:

C語言中的語法也不能完全搞懂,指針的地方模糊了,複習一下,感覺*和&就像是逆運算。

pthread_t是用來聲明線程ID的。

!(pid1 = fork())是什麼意思呢,根據上下文是創建子進程,返回0,才執行if語句,但fork()如果執行成功,是返回兩個值,子進程返回0,父進程返回子進程的ID,另,賦值表達式怎麼可以取反?由於不影響意思,跳過

fork返回新創建子進程的進程ID。我們可以通過fork返回的值來判斷當前進程是子進程還是父進程。引用一位網友的話來解釋fpid的值為什麼在父子進程中不同。“其實就相當於鏈表,進程形成了鏈表,父進程的fpid(p 意味point)指向子進程的進程id,因為子進程沒有子進程,所以其fpid為0.

pthread_create是類Unix操作系統(Unix、Linux、Mac OS X等)的創建線程的函數。它的功能是創建線程(實際上就是確定調用該線程函數的入口點),線上程創建以後,就開始運行相關的線程函數。pthread_create的返回值 表示成功,返回0;表示出錯,返回-1。第一個參數為指向線程標識符指針。第二個參數用來設置線程屬性。第三個參數是線程運行函數的起始地址。最後一個參數是運行函數的參數。 pthread_join()函數,以阻塞的方式等待thread指定的線程結束。當函數返回時,被等待線程的資源被收回。如果線程已經結束,那麼該函數會立即返回。並且thread指定的線程必須是joinable的。參數 :thread: 線程標識符,即線程ID,標識唯一線程。retval: 用戶定義的指針,用來存儲被等待線程的返回值。返回值 : 0代表成功。 失敗,返回的則是錯誤號。代碼中如果沒有pthread_join主線程會很快結束從而使整個進程結束,從而使創建的線程沒有機會開始執行就結束了。加入pthread_join後,主線程會一直等待直到等待的線程結束自己才結束,使創建的線程有機會執行。

waitpid會暫時停止目前進程的執行,直到有信號來到或子進程結束。

如果執行loop,一直迴圈,怎麼跳出來?

到此,還是不知道程式流是怎樣的順序,不會模仿,再難進展了

無奈,只好請教別人,在他的幫助下,寫出了abc.c

下一步要在Ubuntu中編譯測試上述程式,怎麼編譯測試呢?不知道,運行一下吧

7.啟動gcc對代碼進行編譯。
gcc helloworld.c -o execFile(此步驟會生成一個execFlie的文件,可用ls查看)
8.如果有錯誤,系統會提示,按方向鍵找回gedit helloworld.c 的指令,按下回車,彈出文本框後根據系統提示對代碼進行修改,完成後記得保存,
關閉文本框。
9.運行
./execFlie則會開始運行

用putty使用ssh連接虛擬機時也總是出問題,連不上,試驗之後發現,似乎等一個終端提示連接失敗後的信息後,再連就可以了

執行後發現程式沒問題,我的疑惑在於像fork()這種明明沒有定義的函數,他是怎麼可以執行的,可以在windows環境下用vscode試一下老師的程式和abc.c

 

 把擴展包重新載入一下,未解決(橫生枝節,在家裡遇到這種情況就會有畏難情緒)

在網上搜了一下,似乎有一些方法,但不想試了,現在實驗要緊

輸入gcc指令,如下

 

 gcc後面一長串是幹嘛的,查了一下,-o:指定生成的輸出文件

其他的查不到了,只好作罷

 耐心經常就是這樣被磨沒的,但也正是要剋服這一點,忍受在各種不確定的未知的環境中去抓住重點

下麵將abc放入qemu

 將rootfs目錄下的文件_install.tgz解壓,此目錄在哪?【Linux系統中的根文件系統,Root FileSystem,簡稱為rootfs】但我又找到了qume的footfs似乎,這次用的是這個

解壓文件的後面的參數都是幹嘛的?【

-x或--extract或--get:從備份文件中還原文件;
-v或--verbose:顯示指令執行過程;
-z或--gzip或--ungzip:通過gzip指令處理備份文件;
-f<備份文件>或--file=<備份文件>:指定備份文件;
-C <目錄>:這個選項用在解壓縮,若要在特定目錄解壓縮,可以使用這個選項。

】不完全理解,不過有點進步

重新打包生成qume的根文件系統,生成的根文件系統放在了映像文件rootfs.img.gz

運行qume虛擬機,在虛擬機的命令解釋器中運行和測試應用程式abc,由於迴圈執行無法退出,ctrlC不行,esc不行,回車不行,別的不知道怎麼樣做了

重新開一個終端,奇怪,為什麼看不到剛剛運行abc的進程, 把終端關了,可能就是把裡面運行的全關了吧,如下圖

 

由於剛剛的教訓,所有的腳本都沒有保存,更改putty的設置

 

 

 一試才知道,不用改,預設的複製粘貼最快捷了。可以改一下保存的行數,在window裡面

abc沒問題,繼續下一步

啟動調試,設置所有需要的內核斷點

鑒於斷點重新設置,所以打算把上次用的0.gbd略作修改,首先,複製一份文件,命名為新名字,查【

- i 和f選項相反,在覆蓋目標文件之前將給出提示要求用戶確認。回答y時目標文件將被覆蓋,是互動式拷貝。

- r 若給出的源文件是一目錄文件,此時cp將遞歸複製該目錄下所有的子目錄和文件。此時目標文件必須為一個目錄名。

mv dir1 newdir //dir1移動到當前目錄下,並改名字為newdir

只留這啟動的幾行

1 1 target remote localhost:1234 
2 2 dir ~/aos/lab/busybox 
3 3 add-symbol-file ~/aos/lab/busybox/busybox_unstripped 0x8048400 

 

 啟動

 1 nudt@ubuntu:~/aos/lab/cur$ gdb vmlinux -x ~/aos/lab/1.gdb
 2 GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
 3 Copyright (C) 2014 Free Software Foundation, Inc.
 4 License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
 5 This is free software: you are free to change and redistribute it.
 6 There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
 7 and "show warranty" for details.
 8 This GDB was configured as "x86_64-linux-gnu".
 9 Type "show configuration" for configuration details.
10 For bug reporting instructions, please see:
11 <http://www.gnu.org/software/gdb/bugs/>.
12 Find the GDB manual and other documentation resources online at:
13 <http://www.gnu.org/software/gdb/documentation/>.
14 For help, type "help".
15 Type "apropos word" to search for commands related to "word"...
16 Reading symbols from vmlinux...done.
17 /home/nudt/aos/lab/1.gdb: No such file or directory.
18 (gdb)

 

 可執行文件的執行,只需要跟蹤普通進程對此函數的調用,如何體現普通進程,查找上次做的實驗【所有內核線程的task_struct結構的成員的mm值都是0,如果該值非0,則說明是普通進程】

調度的開始和結束:函數_schedule的進入和退出,退出如何體現呢?【b 函數所在文件名:函數最後一行的行號,最後一行指的是}所在行】怎麼知道所在文件名和最後一行的行號,網上找不到,請教別人,【原來文件名在設置斷點時可以看到,這樣去對應目錄就可以找行號了】。已經運行了一個./run s,這個終端應該不好看吧,因為設置的斷點越來越多,還是要再開一個終端./run,去新開的裡面看,運行兩次是否有問題?請教大神,【到外層的虛擬機去看,不用到qume裡面看,據說qume裡面什麼都看不見,這個有待實踐】。kernel文件夾在哪?【linux內核預設存放到/boot下,而/usr/src中可查看內核的信息】但去boot下麵查看,並沒有【在引導文件夾(/boot)下,用戶會看到諸如“vmlinux”或者“vmlinuz”的文件。這兩者都是已編譯的Linux內核。以“z”結尾的是已壓縮的。“vm”代表虛擬記憶體。在SPARC處理器的系統上,用戶可以看見一個zImage文件。一小部分用戶可以發現一個bzImage文件,這也是一個已壓縮的Linux內核。無論用戶有哪個文件,這些引導文件都是不能更改的,除非用戶知道他們正在做什麼。否則系統會變成無法引導,也就是說系統啟動不了了。】

 

 

 

 

 

 【不是這裡,而應該是qume對應的目錄】這說明,沒有理解,之前按教程進行時,都是自己做的操作

進了core.c,看到了不是代碼,而是下麵的,眼都瞎了,看起來像版本的更新日誌【可以往下翻頁】,覺得有點缺乏探索精神,明明試一下就知道,還得問別人

 

 

 跳轉到指定行號【:set nu加行號,:數字行號跳轉,/xxx查找】

 

 

 給函數結束加斷點的前期工作終於做完了,正式加斷點,文件目錄可以有兩種寫法,一種是模仿他上面寫的,另外一個是全的,我先寫的全的,報錯

 

 

 換了一種表達,仍然一樣的錯

 

 

去查Make breakpoint pending on future shared library load? 的問題,網上的教程不敢試,因為不知道在做什麼,怕亂了。突然想到,語句寫錯了

 

 

 總算成功了,一上午從abc放到qume開始,只做到現在,休息一下

下午,繼續加斷點,進程切換的開始,看來腳本語言不支持註釋

 

 

 中斷處理的開始,時鐘中斷和其他中斷,smp_apic_timer_interrupt這個函數網上資料不多。

中斷和異常的結束,從兩個函數準備結束,真正結束是最後一個,但也可能是系統調用的結束。

軟中斷處理的開始和結束,函數的進入和退出,這下對退出怎麼設置比較有經驗了。

 

 

 

 

 

 缺頁異常的開始。

設備不存在異常的開始。

系統調用異常的開始和結束,在參數regs->orig_ax中記錄了系統調用號,有時系統調用的結束位置是在restore_all,系統調用結束前,一般會執行函數prepare_exit_to_usermode。什麼是系統調用?【系統調用把應用程式的請求傳給內核,調用相應的內核函數完成所需的處理,將處理結果返回給應用程式。】do_fast_syscall_32函數沒有在kernel裡面,但在上層目錄找不到對應的entry文件夾,網上找不到。他們說可以用source insight,同時也發現了kernel和arch是同一個目錄,別說基礎薄弱了,就連粗心也成了坑。

 

 

 順利找到結束位置

 

 

 想查看系統調用號,直接輸入display reg->ax不行,這樣不知道行不行,先往下繼續吧

 

 

 

 

 

 增加和刪除CFS隊列中的節點

更新當前進程的vruntime,此函數結束時時鐘已經更新,於是在結束處也加斷點

 

 

準備由核心進入用戶態

設置需要剝奪當前進程而重新調度標誌

到現場為止,斷點設置完畢

運行過程如下

  5 Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-32-generic x86_64)
  6 
  7  * Documentation:  https://help.ubuntu.com/
  8 New release '16.04.6 LTS' available.
  9 Run 'do-release-upgrade' to upgrade to it.
 10 
 11 Last login: Thu Mar 19 18:03:31 2020 from 192.168.91.1
 12 nudt@ubuntu:~$ cd /home/nudt/aos/lab/cur
 13 nudt@ubuntu:~/aos/lab/cur$ ls
 14 0.gdb          fs           modules.builtin  tmp.bp
 15 arch           include      modules.order    tools
 16 block          init         Module.symvers   ubuntu
 17 certs          ipc          net              usr
 18 COPYING        Kbuild       README           virt
 19 CREDITS        Kconfig      REPORTING-BUGS   vmlinux
 20 crypto         kernel       samples          vmlinux-gdb.py
 21 debian.master  lab          scripts          vmlinux.o
 22 Documentation  lib          security         zfs
 23 drivers        MAINTAINERS  sound
 24 dropped.txt    Makefile     spl
 25 firmware       mm           System.map
 26 nudt@ubuntu:~/aos/lab/cur$ vi 0.gdb
 27 nudt@ubuntu:~/aos/lab/cur$ cp 0.gdb 1.gdb
 28 nudt@ubuntu:~/aos/lab/cur$ ls
 29 0.gdb          firmware     mm               System.map
 30 1.gdb          fs           modules.builtin  tmp.bp
 31 arch           include      modules.order    tools
 32 block          init         Module.symvers   ubuntu
 33 certs          ipc          net              usr
 34 COPYING        Kbuild       README           virt
 35 CREDITS        Kconfig      REPORTING-BUGS   vmlinux
 36 crypto         kernel       samples          vmlinux-gdb.py
 37 debian.master  lab          scripts          vmlinux.o
 38 Documentation  lib          security         zfs
 39 drivers        MAINTAINERS  sound
 40 dropped.txt    Makefile     spl
 41 nudt@ubuntu:~/aos/lab/cur$ vi 1.gdb
 42 nudt@ubuntu:~/aos/lab/cur$ ls
 43 0.gdb          firmware     mm               System.map
 44 1.gdb          fs           modules.builtin  tmp.bp
 45 arch           include      modules.order    tools
 46 block          init         Module.symvers   ubuntu
 47 certs          ipc          net              usr
 48 COPYING        Kbuild       README           virt
 49 CREDITS        Kconfig      REPORTING-BUGS   vmlinux
 50 crypto         kernel       samples          vmlinux-gdb.py
 51 debian.master  lab          scripts          vmlinux.o
 52 Documentation  lib          security         zfs
 53 drivers        MAINTAINERS  sound
 54 dropped.txt    Makefile     spl
 55 nudt@ubuntu:~/aos/lab/cur$ gdb vmlinux -x ~/aos/lab/1.gdb
 56 GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
 57 Copyright (C) 2014 Free Software Foundation, Inc.
 58 License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
 59 This is free software: you are free to change and redistribute it.
 60 There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
 61 and "show warranty" for details.
 62 This GDB was configured as "x86_64-linux-gnu".
 63 Type "show configuration" for configuration details.
 64 For bug reporting instructions, please see:
 65 <http://www.gnu.org/software/gdb/bugs/>.
 66 Find the GDB manual and other documentation resources online at:
 67 <http://www.gnu.org/software/gdb/documentation/>.
 68 For help, type "help".
 69 Type "apropos word" to search for commands related to "word"...
 70 Reading symbols from vmlinux...done.
 71 /home/nudt/aos/lab/1.gdb: No such file or directory.
 72 (gdb) b do_execve if $lx_current().mm==0
 73 Breakpoint 1 at 0xc114771b: file fs/exec.c, line 1643.
 74 (gdb)
 75 Note: breakpoint 1 also set at pc 0xc114771b.
 76 Breakpoint 2 at 0xc114771b: file fs/exec.c, line 1643.
 77 (gdb) break __schedule
 78 Breakpoint 3 at 0xc16d1192: file kernel/sched/core.c, line 3104.
 79 (gdb) b ~/aos/lab/4.4.6-ubuntu1604/ubuntu1604/kernel/sched/core.c 3188
 80 Function "~/aos/lab/4.4.6-ubuntu1604/ubuntu1604/kernel/sched/core.c 3188" not defined.
 81 Make breakpoint pending on future shared library load? (y or [n]) n
 82 (gdb) b kernel/sched/core.c 3188
 83 Function "kernel/sched/core.c 3188" not defined.
 84 Make breakpoint pending on future shared library load? (y or [n]) n
 85 (gdb) b <kernel/sched/core.c>:<3188>
 86 No source file named <kernel/sched/core.c>.
 87 Make breakpoint pending on future shared library load? (y or [n]) n
 88 (gdb) b kernel/sched/core.c:3188
 89 Breakpoint 4 at 0xc16d177b: file kernel/sched/core.c, line 3188.
 90 (gdb) break __switch_to//調度時如果切換進程就會調用這個函數
 91 Function "__switch_to//調度時如果切換進程就會調用這個函數" not defined.
 92 Make breakpoint pending on future shared library load? (y or [n]) n
 93 (gdb) break __switch_to
 94 Breakpoint 5 at 0xc101564a: file arch/x86/kernel/process_32.c, line 243.
 95 (gdb) b smp_apic_timer_interrupt
 96 Breakpoint 6 at 0xc1034cfe: file arch/x86/kernel/apic/apic.c, line 913.
 97 (gdb) b do_IRQ
 98 Breakpoint 7 at 0xc1017a95: file arch/x86/kernel/irq.c, line 215.
 99 (gdb) b ret_from_intr
100 Breakpoint 8 at 0xc16d4fe0: file arch/x86/entry/entry_32.S, line 254.
101 (gdb) b ret_from_exception
102 Note: breakpoint 8 also set at pc 0xc16d4fe0.
103 Breakpoint 9 at 0xc16d4fe0: file arch/x86/entry/entry_32.S, line 254.
104 (gdb) b restore_all
105 Breakpoint 10 at 0xc16d5096: file arch/x86/entry/entry_32.S, line 362.
106 (gdb) b __do_softirq
107 Breakpoint 11 at 0xc104d9b5: file kernel/softirq.c, line 231.
108 (gdb) b kernel/sched/softirq.c:302
109 No source file named kernel/sched/softirq.c.
110 Make breakpoint pending on future shared library load? (y or [n]) n
111 (gdb) b kernel/softirq.c:302
112 Breakpoint 12 at 0xc104dbf4: file kernel/softirq.c, line 302.
113 (gdb) b do_page_fault
114 Breakpoint 13 at 0xc103f260: file arch/x86/mm/fault.c, line 1295.
115 (gdb) b do_device_not_available
116 Breakpoint 14 at 0xc1016a68: file arch/x86/kernel/traps.c, line 751.
117 (gdb) b do_fast_syscall_32
118 Breakpoint 15 at 0xc100196c: file arch/x86/entry/common.c, line 408.
119 (gdb) b arch/x86/entry/common.c:486
120 Breakpoint 16 at 0xc1001aa9: file arch/x86/entry/common.c, line 486.
121 (gdb) display reg->ax
122 No symbol "reg" in current context.
123 (gdb) commands 15
124 Type commands for breakpoint(s) 15, one per line.
125 End with a line saying just "end".
126 >display reg->ax
127 >end
128 (gdb) commands 16
129 Type commands for breakpoint(s) 16, one per line.
130 End with a line saying just "end".
131 >display reg->ax
132 >end
133 (gdb) b restore_all
134 Note: breakpoint 10 also set at pc 0xc16d5096.
135 Breakpoint 17 at 0xc16d5096: file arch/x86/entry/entry_32.S, line 362.
136 (gdb) b prepare_exit_to_usermode
137 Breakpoint 18 at 0xc1001879: prepare_exit_to_usermode. (4 locations)
138 (gdb) b enqueue_task_fair
139 Breakpoint 19 at 0xc1075feb: file kernel/sched/fair.c, line 4152.
140 (gdb) b dequeue_task_fair
141 Breakpoint 20 at 0xc10748ba: file kernel/sched/fair.c, line 4200.
142 (gdb) b update_curr
143 Breakpoint 21 at 0xc1070ad9: file kernel/sched/fair.c, line 702.
144 (gdb) b kernel/sched/fair.c:734
145 Breakpoint 22 at 0xc1070c81: file kernel/sched/fair.c, line 734.
146 (gdb) b prepare_exit_to_usermode
147 Note: breakpoint 18 also set at pc 0xc1001879.
148 Note: breakpoint 18 also set at pc 0xc10018b7.
149 Note: breakpoint 18 also set at pc 0xc100194d.
150 Note: breakpoint 18 also set at pc 0xc1001a3c.
151 Breakpoint 23 at 0xc1001879: prepare_exit_to_usermode. (4 locations)
152 (gdb) b set_tsk_need_resched
153 Breakpoint 24 at 0xc1069a97: file ./arch/x86/include/asm/bitops.h, line 75.
154 (gdb)

 

 

關閉除do_execve之外的所有其他斷點【

gdb中的變數從1開始標號,不同的斷點採用變數標號同一管理,可以 用enable、disable等命令管理,同時支持斷點範圍的操作,比如有些命令接受斷點範圍作為參數。

例如:disable 5-8

 

在應用程式abc的main函數入口處設置斷點

創建軟鏈接【建立軟鏈接,只要在ln後面加上選項 –s】

查看abc的.test節的起始虛擬地址【objdump命令是用查看目標文件或者可執行的目標文件的構成的gcc工具。

--disassemble 
-d 
從objfile中反彙編那些特定指令機器碼的section。
-l
--line-numbers 
用文件名和行號標註相應的目標代碼,僅僅和-d、-D或者-r一起使用使用-ld和使用-d的區別不是很大,在源碼級調試的時候有用,要求編譯時使用了-g之類的調試編譯選項。
--all-headers 
-x 
顯示所可用的頭信息,包括符號表、重定位入口。-x 等價於-a -f -h -r -t 同時指定。

結果如下

 1 abc:     file format elf32-i386
 2 abc
 3 architecture: i386, flags 0x00000112:
 4 EXEC_P, HAS_SYMS, D_PAGED
 5 start address 0x08048d0a
 6 
 7 Program Header:
 8     LOAD off    0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12
 9          filesz 0x000a0457 memsz 0x000a0457 flags r-x
10     LOAD off    0x000a0f40 vaddr 0x080e9f40 paddr 0x080e9f40 align 2**12
11          filesz 0x00001040 memsz 0x000023e4 flags rw-
12     NOTE off    0x000000f4 vaddr 0x080480f4 paddr 0x080480f4 align 2**2
13          filesz 0x00000044 memsz 0x00000044 flags r--
14      TLS off    0x000a0f40 vaddr 0x080e9f40 paddr 0x080e9f40 align 2**2
15          filesz 0x00000010 memsz 0x00000028 flags r--
16    STACK off    0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**4
17          filesz 0x00000000 memsz 0x00000000 flags rw-
18    RELRO off    0x000a0f40 vaddr 0x080e9f40 paddr 0x080e9f40 align 2**0
19          filesz 0x000000c0 memsz 0x000000c0 flags r--
20 
21 Sections:
22 Idx Name          Size      VMA       LMA       File off  Algn
23   0 .note.ABI-tag 00000020  080480f4  080480f4  000000f4  2**2
24                   CONTENTS, ALLOC, LOAD, READONLY, DATA
25   1 .note.gnu.build-id 00000024  08048114  08048114  00000114  2**2
26                   CONTENTS, ALLOC, LOAD, READONLY, DATA
27   2 .rel.plt      00000070  08048138  08048138  00000138  2**2
28                   CONTENTS, ALLOC, LOAD, READONLY, DATA
29   3 .init         00000023  080481a8  080481a8  000001a8  2**2
30                   CONTENTS, ALLOC, LOAD, READONLY, CODE
31   4 .plt          000000e0  080481d0  080481d0  000001d0  2**4
32                   CONTENTS, ALLOC, LOAD, READONLY, CODE
33   5 .text         000753e4  080482b0  080482b0  000002b0  2**4
34 :

 

 

 遇到了問題,如下,地址無效,請教大神【16進位,前面加0x,我費了半天勁,他一句就解決了】

設置好斷點

 

 跟蹤到main函數入口處

 出了點問題,只好重啟

 

 

 把腳本整理好,發現運行中出現了問題,如下,於是分別去找斷點5和16,5沒什麼特殊的,16那裡刪除了兩個顯示系統調用號的語句

 

 

 

 

 

 如上圖,還多一個斷點,逐個比對一下,原來之前多按回車,導致多了一個斷點,再次更正。就是不知道怎麼把command14和15的命令加進去

如下圖,

 在暫時關閉斷點時為什麼唯獨留了do_execve,我現在運行,這個斷點特別多,真麻煩【開機之後再設斷點,剛剛多是因為開機過程中多】

 

 

 將腳本整理一下

 1 target remote localhost:1234
 2 dir ~/aos/lab/busybox
 3 add-symbol-file ~/aos/lab/busybox/busybox_unstripped 0x8048400
 4 b do_execve if $lx_current().mm==0
 5 break __schedule
 6 b kernel/sched/core.c:3188
 7 break __switch_to
 8 b smp_apic_timer_interrupt
 9 b do_IRQ
10 b ret_from_intr
11 b ret_from_exception
12 b restore_all
13 b __do_softirq
14 b kernel/softirq.c:302
15 b do_page_fault
16 b do_device_not_available
17 b do_fast_syscall_32
18 b arch/x86/entry/common.c:486
19 b restore_all
20 b prepare_exit_to_usermode
21 b enqueue_task_fair
22 b dequeue_task_fair
23 b update_curr
24 b kernel/sched/fair.c:734
25 b prepare_exit_to_usermode
26 b set_tsk_need_resched
27 disable 2-23
28 dir abc
29 add-symbol-file abc/abc 0x080482b0
30 b abc.c:main

 

 到此,斷點設置完畢

下篇開始調試

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • asp.net core應用常常要通過nginx來反向代理, 普通的web api配置asp.net core反向代理比較常見, 如果在應用中集成了signalr, 如何使用nginx來反代呢? ...
  • 使用UUID或者GUID產生的ID沒有規則 Snowflake演算法是Twitter的工程師為實現遞增而不重覆的ID實現的 概述 分散式系統中,有一些需要使用全局唯一ID的場景,這種時候為了防止ID衝突可以使用36位的UUID,但是UUID有一些缺點,首先他相對比較長,另外UUID一般是無序的。有些時 ...
  • 帶著問題去思考!大家好。 修飾符 修飾符有什麼作用呢?它是什麼東西呢? 首先修飾符有四種 private[ˈpraɪvət] protected [prə'tektɪd] internal [ɪnˈtɜːnl] public [ˈpʌblɪk] 他們的特效依次是: private 修飾符用於設置類或 ...
  • Humanizer 能夠滿足您所有.Net關於操作和展示以下類型的需求,包括字元串、枚舉、日期、時間、時間跨度、數字和數量。它採用 MIT 進行授權分發。 ...
  • using System.Security.Cryptography; static void Main(string[] args) { string rawString = "Make every second count."; string encryptedString = Encrypt3 ...
  • 近期公司重構了些界面,因為換膚和界面定製的緣故,需要把樣式和邏輯分開;所以記錄下關鍵的操作;主要是利用命令代替事件... 1 <Window x:Class="Demo_MVVM.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006 ...
  • 客戶端請求Api資源網關(受保護的資源)時,第一次收到請求會到授權中心(ids4服務網關)獲取驗證公鑰,並保持到記憶體中,後面的請求不會再到授權中心去獲得驗證公鑰,而是Api資源網關(受保護的資源)中直接通過保存下來的驗證公鑰進行驗證,從而通過授權 ...
  • 接下來的問題是記憶體怎麼分割? 這樣就可以將程式的各個段載入到相應的記憶體分區中 1. 固定分區與可變分區 2. 可變分區的管理過程 核心數據結構 請求分配 釋放記憶體 再次申請 例題: 3. 引入分頁 解決記憶體分區導致的記憶體效率問題 1. 可變分區造成的問題 2. 從連續到離散 3. 接下來就是頁表 ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...