當前位置:首頁 » 編程軟體 » gdb編譯優化

gdb編譯優化

發布時間: 2022-08-05 01:40:24

⑴ 為什麼GDB有時候會跳過本來應該執行的語句怎麼解決這個問題啊

這個該執行的都執行了,有些地方你估計沒弄明白。

schele () at schele.c:31
31 int i = (last_task_nr == 0) ? last_task_nr = 1 : last_task_nr;
->這個就執行了你列印的那一句。

38 if (task[i] == NULL)
->這個就執行了你列印的另外一句。

因為沒有全部程序,不清楚 task、last_task_nr 究竟怎麼回事。

修改:
i的問題:
volatile int i = xxxxxxxx;
如果還有問題:你可以:
例如 volatile int * volatile task;
出問題的都加上。
不懂的自己看書吧,基本的東西,我就不講課了。

其他:
int i = (last_task_nr == 0) ? last_task_nr = 1 : last_task_nr;//這里就沒有執行
i++;
-> 下面這個更好理解,也更快(不考慮更多優化),考慮優化就變成了下面的);
int i;
if (!last_task_nr) {
last_task_nr=1;
}
i=last_task_nr+1;
-------------------------------------------------
++i 很可能和last_task_nr+1有固定的的等於或者不等於的關系,所以根本就不需要i,但是程序不完整不能確定。

linux中printerbanner 命令有什麼用

print命令的格式是:
print xxx
p xxx

1. print 操作符
@
是一個和數組有關的操作符,在後面會有更詳細的說明。
::
指定一個在文件或是一個函數中的變數。
{}
表示一個指向內存地址的類型為type的一個對象。

2. 察看內容
全局變數(所有文件可見的)
靜態全局變數(當前文件可見的)
局部變數(當前Scope可見的)

如果你的局部變數和全局變數發生沖突(也就是重名),一般情況下是局部變數會隱藏全局變數。如果此時你想查看全局變數的值時,你可以使用「::」操作符:
file::variable
function::variable
eg:
查看文件f2.c中的全局變數x的值:
gdb) p 'f2.c'::x

註:如果你的程序編譯時開啟了優化選項,那麼在用GDB調試被優化過的程序時,可能會發生某些變數不能訪問,或是取值錯誤碼的情況。對付這種情況時,需要在編譯程序時關閉編譯優化。GCC,你可以使用「-gstabs」 選項來解決這個問題。

3. 察看數組
(1)動態數組:
p *array@len
array:數組的首地址,len:數據的長度
eg:
(gdb) p *array@len
$1 = {2, 4, 6, 8, 10}

(2)靜態數組
可以直接用print數組名,就可以顯示數組中所有數據的內容了。

4. 輸出格式
x 按十六進制格式顯示變數。
d 按十進制格式顯示變數。
u 按十六進制格式顯示無符號整型。
o 按八進制格式顯示變數。
t 按二進制格式顯示變數。
a 按十六進制格式顯示變數。
c 按字元格式顯示變數。
f 按浮點數格式顯示變數。
eg:
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'

⑶ linux 用g++編譯c++代碼的問題

*

運行 gcc/egcs
*

gcc/egcs 的主要選項
*

gdb
*

gdb 的常用命令
*

gdb 使用範例
*

其他程序/庫工具 (ar, objmp, nm, size, strings, strip, ...)
* 創建和使用靜態庫
* 創建和使用共享庫
* 使用高級共享庫特性

1.7.1 運行 gcc/egcs

Linux 中最重要的軟體開發工具是 GCC。GCC 是 GNU 的 C 和 C++ 編譯器。實際上,GCC 能夠編譯三種語言:C、C++ 和 Object C(C 語言的一種面向對象擴展)。利用 gcc 命令可同時編譯並連接 C 和 C++ 源程序。

#DEMO#: hello.c

如果你有兩個或少數幾個 C 源文件,也可以方便地利用 GCC 編譯、連接並生成可執行文件。例如,假設你有兩個源文件 main.c 和 factorial.c 兩個源文件,現在要編譯生成一個計算階乘的程序。

-----------------------
清單 factorial.c
-----------------------
#include <stdio.h>
#include <stdlib.h>

int factorial (int n)
{
if (n <= 1)
return 1;

else
return factorial (n - 1) * n;
}
-----------------------

-----------------------
清單 main.c
-----------------------
#include <stdio.h>
#include <stdlib.h>

int factorial (int n);

int main (int argc, char **argv)
{
int n;

if (argc < 2) {
printf ("Usage: %s n\n", argv [0]);
return -1;
}
else {
n = atoi (argv[1]);
printf ("Factorial of %d is %d.\n", n, factorial (n));
}

return 0;
}
-----------------------

利用如下的命令可編譯生成可執行文件,並執行程序:
$ gcc -o factorial main.c factorial.c
$ ./factorial 5
Factorial of 5 is 120.

GCC 可同時用來編譯 C 程序和 C++ 程序。一般來說,C 編譯器通過源文件的後綴名來判斷是 C 程序還是 C++ 程序。在 Linux 中,C 源文件的後綴名為 .c,而 C++ 源文件的後綴名為 .C 或 .cpp。

但是,gcc 命令只能編譯 C++ 源文件,而不能自動和 C++ 程序使用的庫連接。因此,通常使用 g++ 命令來完成 C++ 程序的編譯和連接,該程序會自動調用 gcc 實現編譯。假設我們有一個如下的 C++ 源文件(hello.C):

#include <iostream.h>

void main (void)
{
cout << "Hello, world!" << endl;
}

則可以如下調用 g++ 命令編譯、連接並生成可執行文件:

$ g++ -o hello hello.C
$ ./hello
Hello, world!

1.7.2 gcc/egcs 的主要選項

表 1-3 gcc 命令的常用選項
選項 解釋
-ansi 只支持 ANSI 標準的 C 語法。這一選項將禁止 GNU C 的某些特色,
例如 asm 或 typeof 關鍵詞。
-c 只編譯並生成目標文件。
-DMACRO 以字元串「1」定義 MACRO 宏。
-DMACRO=DEFN 以字元串「DEFN」定義 MACRO 宏。
-E 只運行 C 預編譯器。
-g 生成調試信息。GNU 調試器可利用該信息。
-IDIRECTORY 指定額外的頭文件搜索路徑DIRECTORY。
-LDIRECTORY 指定額外的函數庫搜索路徑DIRECTORY。
-lLIBRARY 連接時搜索指定的函數庫LIBRARY。
-m486 針對 486 進行代碼優化。
-o FILE 生成指定的輸出文件。用在生成可執行文件時。
-O0 不進行優化處理。
-O 或 -O1 優化生成代碼。
-O2 進一步優化。
-O3 比 -O2 更進一步優化,包括 inline 函數。
-shared 生成共享目標文件。通常用在建立共享庫時。
-static 禁止使用共享連接。
-UMACRO 取消對 MACRO 宏的定義。
-w 不生成任何警告信息。
-Wall 生成所有警告信息。

#DEMO#

MiniGUI 的編譯選項
1.7.3 gdb

GNU 的調試器稱為 gdb,該程序是一個互動式工具,工作在字元模式。在 X Window 系統中,
有一個 gdb 的前端圖形工具,稱為 xxgdb。gdb 是功能強大的調試程序,可完成如下的調試
任務:
* 設置斷點;
* 監視程序變數的值;
* 程序的單步執行;
* 修改變數的值。
在可以使用 gdb 調試程序之前,必須使用 -g 選項編譯源文件。可在 makefile 中如下定義
CFLAGS 變數:
CFLAGS = -g
運行 gdb 調試程序時通常使用如下的命令:
gdb progname

在 gdb 提示符處鍵入help,將列出命令的分類,主要的分類有:
* aliases:命令別名
* breakpoints:斷點定義;
* data:數據查看;
* files:指定並查看文件;
* internals:維護命令;
* running:程序執行;
* stack:調用棧查看;
* statu:狀態查看;
* tracepoints:跟蹤程序執行。
鍵入 help 後跟命令的分類名,可獲得該類命令的詳細清單。

#DENO#
1.7.4 gdb 的常用命令

表 1-4 常用的 gdb 命令
命令 解釋
break NUM 在指定的行上設置斷點。
bt 顯示所有的調用棧幀。該命令可用來顯示函數的調用順序。
clear 刪除設置在特定源文件、特定行上的斷點。其用法為:clear FILENAME:NUM。
continue 繼續執行正在調試的程序。該命令用在程序由於處理信號或斷點而
導致停止運行時。
display EXPR 每次程序停止後顯示表達式的值。表達式由程序定義的變數組成。
file FILE 裝載指定的可執行文件進行調試。
help NAME 顯示指定命令的幫助信息。
info break 顯示當前斷點清單,包括到達斷點處的次數等。
info files 顯示被調試文件的詳細信息。
info func 顯示所有的函數名稱。
info local 顯示當函數中的局部變數信息。
info prog 顯示被調試程序的執行狀態。
info var 顯示所有的全局和靜態變數名稱。
kill 終止正被調試的程序。
list 顯示源代碼段。
make 在不退出 gdb 的情況下運行 make 工具。
next 在不單步執行進入其他函數的情況下,向前執行一行源代碼。
print EXPR 顯示表達式 EXPR 的值。

1.7.5 gdb 使用範例

-----------------
清單 一個有錯誤的 C 源程序 bugging.c
-----------------
#include <stdio.h>
#include <stdlib.h>

static char buff [256];
static char* string;
int main ()
{

printf ("Please input a string: ");
gets (string);

printf ("\nYour string is: %s\n", string);
}
-----------------
上面這個程序非常簡單,其目的是接受用戶的輸入,然後將用戶的輸入列印出來。該程序使用了
一個未經過初始化的字元串地址 string,因此,編譯並運行之後,將出現 Segment Fault 錯誤:
$ gcc -o test -g test.c
$ ./test
Please input a string: asfd
Segmentation fault (core mped)
為了查找該程序中出現的問題,我們利用 gdb,並按如下的步驟進行:
1.運行 gdb bugging 命令,裝入 bugging 可執行文件;
2.執行裝入的 bugging 命令;
3.使用 where 命令查看程序出錯的地方;
4.利用 list 命令查看調用 gets 函數附近的代碼;
5.唯一能夠導致 gets 函數出錯的因素就是變數 string。用 print 命令查看 string 的值;
6.在 gdb 中,我們可以直接修改變數的值,只要將 string 取一個合法的指針值就可以了,為
此,我們在第 11 行處設置斷點;
7.程序重新運行到第 11 行處停止,這時,我們可以用 set variable 命令修改 string 的取值;
8.然後繼續運行,將看到正確的程序運行結果。

#DEMO#

1.7.6 其他程序/庫工具

strip:

nm:

size:

string:

1.7.7 創建和使用靜態庫

創建一個靜態庫是相當簡單的。通常使用 ar 程序把一些目標文件(.o)組合在一起,成為一個單獨的庫,然後運行 ranlib,以給庫加入一些索引信息。

1.7.8 創建和使用共享庫

特殊的編譯和連接選項

-D_REENTRANT 使得預處理器符號 _REENTRANT 被定義,這個符號激活一些宏特性。
-fPIC 選項產生位置獨立的代碼。由於庫是在運行的時候被調入,因此這個
選項是必需的,因為在編譯的時候,裝入內存的地址還不知道。如果
不使用這個選項,庫文件可能不會正確運行。
-shared 選項告訴編譯器產生共享庫代碼。
-Wl,-soname -Wl 告訴編譯器將後面的參數傳遞到連接器。而 -soname 指定了
共享庫的 soname。

# 可以把庫文件拷貝到 /etc/ld.so.conf 中列舉出的任何目錄中,並以
root 身份運行 ldconfig;或者
# 運行 export LD_LIBRARY_PATH='pwd',它把當前路徑加到庫搜索路徑中去。

1.7.9 使用高級共享庫特性

1. ldd 工具

ldd 用來顯示執行文件需要哪些共享庫, 共享庫裝載管理器在哪裡找到了需要的共享庫.

2. soname

共享庫的一個非常重要的,也是非常難的概念是 soname——簡寫共享目標名(short for shared object name)。這是一個為共享庫(.so)文件而內嵌在控制數據中的名字。如前面提到的,每一個程序都有一個需要使用的庫的清單。這個清單的內容是一系列庫的 soname,如同 ldd 顯示的那樣,共享庫裝載器必須找到這個清單。

soname 的關鍵功能是它提供了兼容性的標准。當要升級系統中的一個庫時,並且新庫的 soname 和老的庫的 soname 一樣,用舊庫連接生成的程序,使用新的庫依然能正常運行。這個特性使得在 Linux 下,升級使用共享庫的程序和定位錯誤變得十分容易。

在 Linux 中,應用程序通過使用 soname,來指定所希望庫的版本。庫作者也可以通過保留或者改變 soname 來聲明,哪些版本是相互兼容的,這使得程序員擺脫了共享庫版本沖突問題的困擾。

查看/usr/local/lib 目錄,分析 MiniGUI 的共享庫文件之間的關系

3. 共享庫裝載器

當程序被調用的時候,Linux 共享庫裝載器(也被稱為動態連接器)也自動被調用。它的作用是保證程序所需要的所有適當版本的庫都被調入內存。共享庫裝載器名字是 ld.so 或者是 ld-linux.so,這取決於 Linux libc 的版本,它必須使用一點外部交互,才能完成自己的工作。然而它接受在環境變數和配置文件中的配置信息。

文件 /etc/ld.so.conf 定義了標准系統庫的路徑。共享庫裝載器把它作為搜索路徑。為了改變這個設置,必須以 root 身份運行 ldconfig 工具。這將更新 /etc/ls.so.cache 文件,這個文件其實是裝載器內部使用的文件之一。

可以使用許多環境變數控制共享庫裝載器的操作(表1-4+)。

表 1-4+ 共享庫裝載器環境變數
變數 含義
LD_AOUT_LIBRARY_PATH 除了不使用 a.out 二進制格式外,與 LD_LIBRARY_PATH 相同。
LD_AOUT_PRELOAD 除了不使用 a.out 二進制格式外,與 LD_PRELOAD 相同。
LD_KEEPDIR 只適用於 a.out 庫;忽略由它們指定的目錄。
LD_LIBRARY_PATH 將其他目錄加入庫搜索路徑。它的內容應該是由冒號
分隔的目錄列表,與可執行文件的 PATH 變數具有相同的格式。
如果調用設置用戶 ID 或者進程 ID 的程序,該變數被忽略。
LD_NOWARN 只適用於 a.out 庫;當改變版本號是,發出警告信息。
LD_PRELOAD 首先裝入用戶定義的庫,使得它們有機會覆蓋或者重新定義標准庫。
使用空格分開多個入口。對於設置用戶 ID 或者進程 ID 的程序,
只有被標記過的庫才被首先裝入。在 /etc/ld.so.perload 中指定
了全局版本號,該文件不遵守這個限制。

4. 使用 dlopen

另外一個強大的庫函數是 dlopen()。該函數將打開一個新庫,並把它裝入內存。該函數主要用來載入庫中的符號,這些符號在編譯的時候是不知道的。比如 Apache Web 伺服器利用這個函數在運行過程中載入模塊,這為它提供了額外的能力。一個配置文件控制了載入模塊的過程。這種機制使得在系統中添加或者刪除一個模塊時,都不需要重新編譯了。

可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定義,並在 dl 庫中實現。它需要兩個參數:一個文件名和一個標志。文件名可以是我們學習過的庫中的 soname。標志指明是否立刻計算庫的依賴性。如果設置為 RTLD_NOW 的話,則立刻計算;如果設置的是 RTLD_LAZY,則在需要的時候才計算。另外,可以指定 RTLD_GLOBAL,它使得那些在以後才載入的庫可以獲得其中的符號。

當庫被裝入後,可以把 dlopen() 返回的句柄作為給 dlsym() 的第一個參數,以獲得符號在庫中的地址。使用這個地址,就可以獲得庫中特定函數的指針,並且調用裝載庫中的相應函數。

⑷ 如何在Windows的命令行下進行程序編譯和gdb

1、概念介紹。

1、Windows下的cmd就是Windows的命令行終端,其中的一些命令和Ubuntu的有些許區別,不過在這個博客的范疇中沒有涉及。
2、Windows的環境變數,大概可以說是如果設置好了在path路徑裡面了,就可以直接在cmd命令行里直接調用程序。

2、配置操作

1、選擇計算機,右鍵,選擇「屬性」
2、「高級系統設置」 –> 「環境變數」

4、後期優化

大家還可以給自己配一個用的順手的編輯器,比如sublime,gvim,(甚至是notepad ,hhh)同理把它放在環境變數里,那麼也可以在cmd中直接打開,這時在win下的編程過程就和Ubuntu的非常像了。。

5、備注

1、此處以win7為例,其他版本的應該大同小異。

2、另附片面的gdb調試方法

3、使用編輯器和命令行編譯的方法對於了解程序的運行過程更加有好處,但是從方便性上的確不如IDE,特別是用熟了vs的同學們就應該更能體會得到,所以各有利弊,大家自己選擇最符合自己口味的編程環境就好:)

⑸ 如何print Array

具體參數及講解如下:

print命令的格式是:
print xxx
p xxx

1. print 操作符
@
是一個和數組有關的操作符,在後面會有更詳細的說明。
::
指定一個在文件或是一個函數中的變數。
{}
表示一個指向內存地址的類型為type的一個對象。

2. 察看內容
全局變數(所有文件可見的)
靜態全局變數(當前文件可見的)
局部變數(當前Scope可見的)

如果你的局部變數和全局變數發生沖突(也就是重名),一般情況下是局部變數會隱藏全局變數。如果此時你想查看全局變數的值時,你可以使用「::」操作符:
file::variable
function::variable
eg:
查看文件f2.c中的全局變數x的值:
gdb) p 'f2.c'::x

註:如果你的程序編譯時開啟了優化選項,那麼在用GDB調試被優化過的程序時,可能會發生某些變數不能訪問,或是取值錯誤碼的情況。對付這種情況時,需要在編譯程序時關閉編譯優化。GCC,你可以使用「-gstabs」 選項來解決這個問題。

3. 察看數組
(1)動態數組:
p *array@len
array:數組的首地址,len:數據的長度
eg:
(gdb) p *array@len
$1 = {2, 4, 6, 8, 10}

(2)靜態數組
可以直接用print數組名,就可以顯示數組中所有數據的內容了。

4. 輸出格式
x 按十六進制格式顯示變數。
d 按十進制格式顯示變數。
u 按十六進制格式顯示無符號整型。
o 按八進制格式顯示變數。
t 按二進制格式顯示變數。
a 按十六進制格式顯示變數。
c 按字元格式顯示變數。
f 按浮點數格式顯示變數。
eg:
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'

5. 察看內存
使用examine(簡寫x)來查看內存地址中的值。語法:
x/
n、f、u是可選的參數。
(1)n 是一個正整數,表示顯示內存的長度,也就是說從當前地址向後顯示幾個地址的內容。
(2)f 表示顯示的格式,參見上面。如果地址所指的是字元串,那麼格式可以是s,如果地十是指令地址,那麼格式可以是i。
(3)u 表示從當前地址往後請求的位元組數,如果不指定的話,GDB默認是4個bytes。u參數可以用下面的字元來代替,b表示單位元組,h表示雙位元組,w表示四字 節,g表示八位元組。當我們指定了位元組長度後,GDB會從指內存定的內存地址開始,讀寫指定位元組,並把其當作一個值取出來。
eg:
x/3uh 0x54320 :從內存地址0x54320讀取內容,h表示以雙位元組為一個單位,3表示三個單位,u表示按十六進制顯示。
6. 察看寄存器
(1)要查看寄存器的值,很簡單,可以使用如下命令:
info registers
(2)查看寄存器的情況。(除了浮點寄存器)
info all-registers
(3)查看所有寄存器的情況。(包括浮點寄存器)
info registers
(4)查看所指定的寄存器的情況。
寄存器中放置了程序運行時的數據,比如程序當前運行的指令地址(ip),程序的當前堆棧地址(sp)等等。你同樣可以使用print命令來訪問寄存器的情況,只需要在寄存器名字前加一個$符號就可以了。如:p $eip。

7. display自動顯示的變數
(1)格式:display[/i|s] [expression | addr]
eg:
display/i $pc
$pc是GDB的環境變數,表示著指令的地址,/i則表示輸出格式為機器指令碼,也就是匯編。於是當程序停下後,就會出現源代碼和機器指令碼相對應的情形,這是一個很有意思的功能。
(2)其他
undisplay
delete display
刪除自動顯示,dnums意為所設置好了的自動顯式的編號。如果要同時刪除幾個,編號可以用空格分隔,如果要刪除一個范圍內的編號,可以用減號表示(如:2-5)

disable display
enable display
disable和enalbe不刪除自動顯示的設置,而只是讓其失效和恢復。

info display
查看display設置的自動顯示的信息。GDB會打出一張表格,向你報告當然調試中設置了多少個自動顯示設置,其中包括,設置的編號,表達式,是否enable。

8. 設置
(1)set print address
set print address on
打開地址輸出,當程序顯示函數信息時,GDB會顯出函數的參數地址。
(2)set print array
set print array on
打開數組顯示,打開後當數組顯示時,每個元素佔一行,如果不打開的話,每個元素則以逗號分隔。
(3)set print elements
這個選項主要是設置數組的,如果你的數組太大了,那麼就可以指定一個來指定數據顯示的最大長度,當到達這個長度時,GDB就不再往下顯示了。如果設置為0,則表示不限制。
(4)set print null-stop
如果打開了這個選項,那麼當顯示字元串時,遇到結束符則停止顯示。這個選項默認為off。
(5)set print pretty on
如果打開printf pretty這個選項,那麼當GDB顯示結構體時會比較漂亮。如:
$1 = {
next = 0x0,
flags = {
sweet = 1,
sour = 1
},
meat = 0x54 "Pork"
}

(6)set print union
設置顯示結構體時,是否顯式其內的聯合體數據。
(7)set print object
在C++中,如果一個對象指針指向其派生類,如果打開這個選項,GDB會自動按照虛方法調用的規則顯示輸出,如果關閉這個選項的話,GDB就不管虛函數表了。

⑹ gdb變數不存在

你問的gdb變數不存在的原因吧。在用GDB調試被優化過的程序時,可能會發生某些變數不能訪問,或是取值錯誤碼的情況。
優化程序會刪改程序,整理程序的語句順序,剔除一些無意義的變數等,所以在GDB調試這種程序時,運行時的指令和你所編寫指令就有不一樣,也就會出現你所想像不到的結果。對付這種情況時,需要在編譯程序時關閉編譯優化。
gdb是UNIX及UNIX-like下的調試工具。該工具能啟動程序,可讓被調試的程序在所指定的調置的斷點處停住(斷點可以是條件表達式),當程序被停住時,可以檢查此時程序中所發生的事,還可以改變程序,將一個BUG產生的影響修正從而測試其他BUG。

⑺ (Linux)gcc進行優化編譯的參數是什麼

將file.c文件編譯產生可執行文件myprog(-o選項),並且在編譯的時候,生成調試信息(-g信息)。讓gdb調試器可以調試該程序。
gcc是編譯器程序名字
-o是可執行文件名字輸出參數
-g是插入調試信息參數
當然是調試可執行文件myprog

⑻ 在linux中如何編譯C程序,使之成為可執行文件如何調試

Gcc最基本的用法是∶gcc [options] [filenames] 其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。 -c,只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為後綴的目標文件,通常用於編譯不包含主程序的子程序文件。 -o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。 -g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。 -O,對程序進行優化編譯、連接,採用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。 -O2,比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢.
例子:
gcc -o test test.c
結果生成可執行文件test

⑼ 請問linux下,gcc編譯程序的過程(從讀取源文件到製作可執行程序中間所有過程,越詳細越好)

gcc -S *.c 預處理+反匯編

熱點內容
安卓手機如何有蘋果的emoji 發布:2025-02-09 02:11:02 瀏覽:807
編譯原理已知語言求文法習題 發布:2025-02-09 02:05:15 瀏覽:131
中國首個具有世界影響力的編譯器 發布:2025-02-09 01:56:21 瀏覽:719
tomcat上傳超時 發布:2025-02-09 01:41:42 瀏覽:483
androidactivity豎屏 發布:2025-02-09 01:41:40 瀏覽:377
家庭配置怎麼合理 發布:2025-02-09 01:36:14 瀏覽:807
頭條軍事源碼 發布:2025-02-09 01:31:53 瀏覽:997
androidintent視頻 發布:2025-02-09 01:31:43 瀏覽:858
歐姆龍plc密碼如何設置 發布:2025-02-09 01:24:31 瀏覽:687
php支持jpeg 發布:2025-02-09 01:24:22 瀏覽:803