主頁 > 作業系統 > 高級作業系統實驗2-行程調度與切換分析(2)

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

2020-09-25 07:35:56 作業系統

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

 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

 

 到此,斷點設定完畢

下篇開始除錯

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/124040.html

標籤:Linux

上一篇:附014.Kubernetes Prometheus+Grafana+EFK+Kibana+Glusterfs整合性方案

下一篇:作業系統-記憶體磁區與分頁

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more