常用軟件運行庫(應(yīng)用程序無法正常啟動,圖文詳解應(yīng)用程序無法正常啟動的解決方法)
常用軟件運行庫文章列表:
- 1、應(yīng)用程序無法正常啟動,圖文詳解應(yīng)用程序無法正常啟動的解決方法
- 2、GUN軟件有哪些?你都了解了嗎?
- 3、摩爾線程推出國產(chǎn)全功能GPU蘇堤:耗時僅18個月就可量產(chǎn)上市
- 4、4096 核,32GB 顯存!摩爾線程發(fā)布全新元計算架構(gòu) MUSA 和 GPU 產(chǎn)品
- 5、核酸檢測結(jié)果匯總統(tǒng)計助手功能上線 批量統(tǒng)計核酸報告有神器了
應(yīng)用程序無法正常啟動,圖文詳解應(yīng)用程序無法正常啟動的解決方法
最近有小伙伴反映說不知為何新安裝的幾個游戲,程序都打不開,全都提示著應(yīng)用程序無法正常啟動0xc000007b,究竟是什么原因造成的呢?下面小編就來給你們普及一下這方面的知識。
應(yīng)用程序無法正常啟動0xc000007b?其實吧出現(xiàn)這個問題的原因很簡單,就是因為系統(tǒng)沒有,導(dǎo)致游戲兼容上的問題,造成顯示0xc000007b內(nèi)存出錯。下面,小編給大家分享電腦應(yīng)用程序無法正常啟動0xc000007b。
應(yīng)用程序無法正常啟動0xc000007b原因:
1、電腦沒有安裝DirectX9或者DirectX 9.0 組件損壞;
2、電腦沒有安裝Microsoft Visual C
3、電腦上沒有安裝.net
解決辦法
安裝DirectX 9.0c
形成原因是電腦沒有安裝DirectX9或者DirectX 9.0 組件損壞, 我們只需要安裝即可。
有很多人可能安裝了DirectX 9.0c還是會提示!這個可能是因為你的電腦未安裝32位版本的DirectX文件!這些有些對電腦不懂得就會不知道怎么辦! 我們可以使用DirectX修復(fù)工具! 一鍵即可修復(fù)。
示例1
安裝Microsoft Visual C 2005、2008、2010運行庫
形成原因是電腦沒有安裝Microsoft Visual C 的用戶,下載安裝Microsoft Visual C 2005、2008、2010運行庫,需要注意的是32位系統(tǒng)只安裝32位的即可,64位系統(tǒng),32位和64位的都要安裝。
應(yīng)用程序無法正常啟動示例2
安裝.net運行庫
形成原因是電腦上沒有安裝.net的用戶,下載安裝 Mircosoft.net framework 4.0。
無法正常啟動示例3
通常這三步,可以解決大部分的應(yīng)用程序無法正常啟動0xc000007b的問題
GUN軟件有哪些?你都了解了嗎?
GNU簡介
GNU計劃,又譯為“革奴計劃”,它的目標(biāo)是創(chuàng)建一套完全自由的操作系統(tǒng)GNU,并且其內(nèi)容軟件完全以GPL方式發(fā)布。這個操作系統(tǒng)是GNU計劃的主要目標(biāo),名稱來自GNU's Not unix!的遞歸縮寫,因為GNU的設(shè)計類似Unix,但它不包含具著作權(quán)的Unix代碼。
作為操作系統(tǒng),GNU的發(fā)展仍未完成,其中最大的問題是具有完備功能的內(nèi)核尚未被開發(fā)成功。GNU的內(nèi)核,稱為Hurd,是自由軟件基金會發(fā)展的重點,但是其發(fā)展尚未成熟。在實際使用上,多半使用linux內(nèi)核作為系統(tǒng)核心。
Linux操作系統(tǒng)包含了Linux內(nèi)核與其他自由軟件項目中的GNU組件和軟件,可以被稱為GNU/Linux。
GNU組件及軟件非常豐富,如:
1、gcc
GCC原名為GNU C語言編譯器(GNU C Compiler),只能處理C語言。但其很快擴展,變得可處理C ,后來又?jǐn)U展為能夠支持更多編程語言,如Fortran、Pascal、Objective -C、Java、Ada、Go以及各類處理器架構(gòu)上的匯編語言等,所以改名GNU編譯器套件(GNU Compiler Collection)。
2、glibc
glibc是GNU發(fā)布的libc庫,即c運行庫。glibc是linux系統(tǒng)中最底層的api,幾乎其它任何運行庫都會依賴于glibc。glibc除了封裝linux操作系統(tǒng)所提供的系統(tǒng)服務(wù)外,它本身也提供了許多其它一些必要功能服務(wù)的實現(xiàn)。
glibc與libc的關(guān)系:
glibc 和 libc 都是 Linux 下的 C 函數(shù)庫。libc 是 Linux 下的 ANSI C 函數(shù)庫;glibc 是 Linux 下的 GUN C 函數(shù)庫。
ANSI C 函數(shù)庫是基本的 C 語言函數(shù)庫,包含了 C 語言最基本的庫函數(shù)。這個庫可以根據(jù)頭文件劃分為 15 個部分,其中包括:
glibc是linux下面c標(biāo)準(zhǔn)庫的實現(xiàn),即GNU C Library。glibc本身是GNU旗下的C標(biāo)準(zhǔn)庫,后來逐漸成為了Linux的標(biāo)準(zhǔn)c庫,而Linux下原來的標(biāo)準(zhǔn)c庫Linux libc逐漸不再被維護。
Linux下面的標(biāo)準(zhǔn)c庫不僅有這一個,如uclibc、klibc,以及上面被提到的Linux libc,但是glibc無疑是用得最多的。glibc在/lib目錄下的.so文件為libc.so.6。
libc 實際上是一個泛指。凡是符合實現(xiàn)了 C 標(biāo)準(zhǔn)規(guī)定的內(nèi)容,都是一種 libc 。glibc 是 GNU 組織對 libc 的一種實現(xiàn)。它是 unix/linux 的根基之一。嵌入式行業(yè)里還常用 uClibc ,是一個迷你版的 libc 。
3、coreutils
coreutils 是GNU下的一個軟件包,這個軟件包中包含了很多程序,如ls、mv等程序。常用的如:
4、GDB
GDB(GNU symbolic debugger)是 GNU Project 調(diào)試器。
GDB 可以做四種主要的事情(以及支持這些事情的其他事情)來幫助你捕獲行為中的錯誤:
啟動你的程序,并指定可能影響其行為的所有內(nèi)容。
使程序在指定條件下停止。
檢查程序停止時發(fā)生的情況。
更改程序中的內(nèi)容,以便你可以嘗試糾正一個錯誤的影響,然后繼續(xù)學(xué)習(xí)另一個錯誤。
這些程序可能與GDB(本機)在同一臺計算機上執(zhí)行,在另一臺計算機(遠(yuǎn)程)上或在模擬器上執(zhí)行。
5、binutils
GNU binutils是一組二進制工具集。包含的工具有:
6、其它
GNU系統(tǒng)包括很多軟件包,還包括非GNU的自由軟件。具體的介紹可以上gnu官網(wǎng)(http://www.gnu.org/software/)上查看:
以上是對GNU及其內(nèi)容做了一個簡單的介紹,下面對GUN相關(guān)的內(nèi)容做一些實例分享:
GCC編譯、鏈接
1、基本編譯流程
使用gcc工具集將C語言源代碼生成可執(zhí)行程序需要經(jīng)過4個步驟:預(yù)處理、編譯、匯編、鏈接。如:
首先,調(diào)用預(yù)處理器cpp進行預(yù)處理,對源代碼.c文件中的文件包含(include)、預(yù)編譯語句(如宏定義define等)進行分析,生成.i文件。
接著調(diào)用編譯器gcc進行編譯,輸入上一步的.i文件,輸出.s匯編文件。
然后調(diào)用匯編器as將.s為后綴的匯編語言文件處理生成以.o為后綴的目標(biāo)文件。
當(dāng)所有的目標(biāo)文件都生成之后,調(diào)用鏈接器ld來進行鏈接生成可執(zhí)行文件或庫文件。這一節(jié)我們先看生成可執(zhí)行文件,下一節(jié)再看如何生成庫文件。
其中上圖中表明的-E、-S、-c為gcc編譯參數(shù)。gcc的基本用法如下:
gcc [options] [filenames]
下面以一個實例來演示將C語言源代碼生成可執(zhí)行程序的過程。
示例代碼hello.c:
#include <stdio.h>int main(void){ printf("Hello gccn"); return 0;}
(1)預(yù)處理過程
使用預(yù)處理器cpp把源文件hello.c經(jīng)過預(yù)處理生成hello.i文件,預(yù)處理用于將所有的#include頭文件以及宏定義替換成其真正的內(nèi)容。
預(yù)處理的命令為:
gcc -E hello.c -o hello.i
上述命令中-E是讓編譯器在預(yù)處理之后就退出,不進行后續(xù)編譯過程;-o是指定輸出文件名。
預(yù)處理之后得到的仍然是文本文件。hello.i文件部分內(nèi)容截圖如下:
(2)編譯過程
使用編譯器將預(yù)處理文件hello.i編譯成匯編文件hello.s。
編譯的命令為:
gcc -S hello.i -o hello.s
上述命令中-S讓編譯器在編譯之后停止,不進行后續(xù)過程;-o是指定輸出文件名。匯編文件hello.s是文本文件,部分內(nèi)容截圖如下:
(3)匯編過程
使用匯編器將匯編文件hello.s轉(zhuǎn)換成目標(biāo)文件hello.o。
匯編過程的命令為:
gcc -c hello.s -o hello.o
上述命令中-c、-o讓匯編器把匯編文件hello.s轉(zhuǎn)換成目標(biāo)文件hello.o。目標(biāo)文件hello.o是二進制文件。這時候我們可以使用如下命令查看hello.o的格式:
file hello.o
顯示的內(nèi)容:
hello.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
可以看到,hello.o是個ELF(Executable and Linking Format,可執(zhí)行鏈接格式)格式文件。另外,hello.o是個二進制文件,使用vscode打開可能會出現(xiàn)亂碼,可以安裝一個Binary插件。部分內(nèi)容截圖如下:
(4)鏈接過程
鏈接過程使用鏈接器將該目標(biāo)文件與其他目標(biāo)文件、庫文件、啟動文件等鏈接起來生成可執(zhí)行文件。
命令為:
gcc hello.o -o hello
綜上:
2、動態(tài)、靜態(tài)鏈接
上一節(jié)的第(4)步的鏈接過程分為兩種。一種是靜態(tài)鏈接,另外一種是動態(tài)鏈接。它們的區(qū)別如:
(1)靜態(tài)鏈接
優(yōu)點:代碼裝載速度快,執(zhí)行速度略比動態(tài)鏈接庫快。
缺點:使用靜態(tài)鏈接生成的可執(zhí)行文件體積較大,包含相同的公共代碼,造成浪費。
(2)動態(tài)鏈接
優(yōu)點:生成的可執(zhí)行文件較靜態(tài)鏈接生成的可執(zhí)行文件小。
缺點:速度比靜態(tài)鏈接慢;使用動態(tài)鏈接庫的應(yīng)用程序不是自完備的,需要依賴相關(guān)庫。
初學(xué),理解不了?沒關(guān)系,分享一個易懂的比喻:
把鏈接過程看做我們平時學(xué)習(xí)時做筆記的過程。我們平時學(xué)習(xí)時準(zhǔn)備一本筆記本專門記錄我們的學(xué)習(xí)筆記,比如在某本書的某一頁上看到一個很好很有用的知識,這時候我們有兩種方法記錄在我們的筆記本上,一種是直接把那一頁的內(nèi)容全部抄寫一遍到筆記本上(靜態(tài)鏈接);另一種是我們在筆記本上做個簡單的記錄(動態(tài)鏈接),比如寫上:xxx知識點在《xxx》的xxx頁。
從這兩種方法中我們可以很清楚地知道兩種方式的特點,第一種方式的優(yōu)點就是我們在復(fù)習(xí)的時候就很方便,不用翻閱其它書籍了,但是缺點也很明顯,就是占用筆記本的空間很多,這種方法很快就把我們的筆記本給寫滿了。第二種方式的優(yōu)點就是很省空間,缺點就是每當(dāng)我們復(fù)習(xí)的時候,手頭上必須備著相關(guān)的參考書籍,比如我們?nèi)ソ淌覐?fù)習(xí)的時候,就得背著一大摞書去復(fù)習(xí),這樣我們復(fù)習(xí)的效率可能就沒有那么高了。
這對應(yīng)到我們的動態(tài)鏈接與靜態(tài)鏈接上是不是就很好理解了。
下面看看具體實例:
文件1(main.c):
#include "hello.h"int main(void){print_hello();return 0;}
文件2(hello.c):
#include "hello.h"void print_hello(void){printf("hello worldn");}
文件3(hello.h):
#ifndef __HELLO_H#define __HELLO_H#include <stdio.h>void print_hello(void);#endif
① 演示動態(tài)鏈接
首先,將源文件生成目標(biāo)文件(*.o),命令:
gcc -c main.c hello.c
在Linux中,動態(tài)庫的擴展名一般為.so。我們把上面生成的hello.o文件生成相應(yīng)的動態(tài)庫,命令:
gcc -shared hello.o -o libhello.so
使用鏈接動態(tài)庫的方式生成可執(zhí)行程序,命令:
gcc main.o -L. -lhello -o hello_d_lib_test
這里的-L.的含義是在搜索庫文件時包含當(dāng)前目錄,-lhello的含義是鏈接名稱為libhello.so的動態(tài)庫。
此時,運行hello_d_lib_test程序,可能會出現(xiàn)如下錯誤:
./hello_d_lib_test: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory
這是因為找不到共享庫文件libhello.so,加載失敗。因為一般情況下Linux會在/usr/lib路徑中搜索需要用到的庫,而libhello.so庫并不在這個路徑下。
解決方法有如下幾種:
把這個文件拷貝至/usr/lib路徑下。
.配置文件/etc/ld.so.conf中指定的動態(tài)庫搜索路徑。
臨時生效,可以用 LD_LIBRARY_PATH 環(huán)境變量指定。
我們這里作為測試,使用臨時生效的方式,使用環(huán)境變量LD_LIBRARY_PATH指定當(dāng)前路徑為動態(tài)庫搜索路徑,命令:
export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
這時候再次運行程序就可以正常運行了。
② 演示靜態(tài)鏈接
靜態(tài)庫用ar工具來制作。ar是一個歸檔工具,用于建立、修改、提取歸檔文件(archive)。一個歸檔文件可以包含多個目標(biāo)文件,也被稱為靜態(tài)庫。在Linux下,靜態(tài)庫的擴展名一般為.a。
把目標(biāo)文件hello.o做成靜態(tài)庫,命令:
ar -rv libhello.a hello.o
其中rv參數(shù)為組合參數(shù),其中r參數(shù)表示當(dāng)建立的模塊名已經(jīng)存在時,則覆蓋同名模塊,v參數(shù)用來顯示附加信息,比如被處理的文件的名字。
使用鏈接靜態(tài)庫的方法生成可執(zhí)行程序,命令:
gcc main.o -L. -lhello -o hello_s_lib_test
刪除靜態(tài)庫之后,可執(zhí)行程序也是能正常運行的。事實上,使用鏈接靜態(tài)庫的方式生成的可執(zhí)行程序與直接使用目標(biāo)文件生成的可執(zhí)行程序沒有區(qū)別。只是經(jīng)過了靜態(tài)庫的鏈接,變?yōu)榱艘粋€文件,方便于調(diào)用、移植和保存。
歸檔工具ar可以很方便地查看和刪除歸檔文件中的成員。
查看靜態(tài)庫libhello.a中的內(nèi)容,命令:
關(guān)于ar工具更多的命令參數(shù)可輸入ar --help進行查看。
GCC工具集的使用
1、ar工具的使用
基本使用如上面靜態(tài)鏈接中的用法。
2、addr2line工具的使用
addr2line可以將地址信息轉(zhuǎn)化成函數(shù)名或行數(shù)。例如,如下代碼運行會產(chǎn)生段錯誤:
test.c:
#include <stdio.h> int main(void){char *str = "hello";str[0] = 'a';return 0;}
首先,編譯時加上-g參數(shù),產(chǎn)生調(diào)試信息。
gcc test.c -g -o test
運行會產(chǎn)生段錯誤Segmentation fault (core dumped)。此時會產(chǎn)生相關(guān)錯誤系統(tǒng)存于系統(tǒng)日志中。我們可以使用如下命令查看我們當(dāng)前程序的錯誤信息:
dmesg | grep test
此時會輸出類似如下信息:
[ 1081.831805] test[2763]: segfault at 55f1d81186a4 ip 000055f1d811860d sp 00007ffc6fc1d080 error 7 in test_addr2line[55f1d8118000 1000]
此時借助addr2line工具可以查到產(chǎn)生錯誤的行號:
addr2line -e test 55f1d81186a4
3、nm工具的使用
nm工具用于顯示文件中的符號,可以用于各種ELF格式文件。ELF格式文件包括如下三種類型:
nm工具的使用方式:
nm [option] [file]
其中,可以使用nn --help命令來查看支持的參數(shù)。其中,nm顯示的符號類型如:
其中符號類型有大小寫之分,小寫字母表示這個符號是局部符號,大寫字母表示這個符號是全局符號。
下面一起來使用nm工具查看目標(biāo)目標(biāo)文件的標(biāo)號。
實例代碼test.c:
#include <stdio.h>static int a = 1;static int b;void print_hello(void){ printf("hellon");}int main(void){ print_hello();}
編譯之后得到可執(zhí)行程序test。執(zhí)行如下命令查看test中的符號:
nm test
輸出結(jié)果如:
0000000000201010 d a0000000000201018 b b# 省略部分內(nèi)容......000000000000064d T main000000000000063a T print_hello# 省略部分內(nèi)容......
從輸出結(jié)果可以知道,a是一個全局符號,該符號位于已初始化數(shù)據(jù)(RW Data)部分。b也是一個全局符號,該符號位于未初始化數(shù)據(jù)(BSS)部分。main符號與print_hello符號位于代碼部分。
4、strip工具的使用
strip工具用于刪除文件中的符號。
strip工具的使用方式:
strip [option] [file]
其中,可以使用strip--help命令來查看支持的參數(shù)。
我們以nm工具的演示代碼來做演示。我們編譯得到的可執(zhí)行程序為test。沒有執(zhí)行strip之前,使用nm命令查看到的符號如:
0000000000201010 d a0000000000201018 b b# 省略部分內(nèi)容......000000000000064d T main000000000000063a T print_hello# 省略部分內(nèi)容......
使用ls -lh test命令查看test程序的大小為:8.2k。
這時候執(zhí)行如下命令刪除test的符號部分,輸出test_strip文件:
strip test -o test_strip
使用nm命令查看test_strip文件是否有符號,顯示結(jié)果為:
nm: test_strip: no symbols
表示test_strip沒有符號。使用ls -lh test_strip命令查看test_strip的大小為:6k。可見去掉符號表之后地程序變小了。在資源有限的系統(tǒng)中,可以使用這種方法為程序進行瘦身。
5、readelf工具的使用
readelf工具用于顯示ELF格式文件的信息。例如:
readelf -h test
輸出結(jié)果如:
ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x530 Start of program headers: 64 (bytes into file) Start of section headers: 6528 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 9 Size of section headers: 64 (bytes) Number of section headers: 29 Section header string table index: 28
通過輸出信息可以知道文件的類型、文件的格式等信息。
6、objdump工具的使用
objdump工具用于顯示目標(biāo)文件的信息。
objdump工具的使用方式:
objdump [option] [file]
如:
objdump -h hello.o
輸出結(jié)果如:
hello.o: file format elf64-x86-64Sections:Idx Name Size VMA LMA File off Algn 0 .text 00000013 0000000000000000 0000000000000000 00000040 2**0 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000000 0000000000000000 0000000000000000 00000053 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 0000000000000000 0000000000000000 00000053 2**0 ALLOC 3 .rodata 0000000c 0000000000000000 0000000000000000 00000053 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .comment 0000002a 0000000000000000 0000000000000000 0000005f 2**0 CONTENTS, READONLY 5 .note.GNU-stack 00000000 0000000000000000 0000000000000000 00000089 2**0 CONTENTS, READONLY 6 .eh_frame 00000038 0000000000000000 0000000000000000 00000090 2**3 CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
顯示內(nèi)容包含目標(biāo)文件各個節(jié)的信息。
7、strings工具的使用
strings工具用于查看文件中的字符串。
strings工具的使用方式:
strings [option] [file]
其中,可以使用strings--help命令來查看支持的參數(shù)。
實例代碼test.c:
#include <stdio.h>int main(void){ printf("11111n"); printf("22222n"); printf("33333n"); printf("44444n"); printf("55555n");}
編譯之后得到可執(zhí)行程序test。執(zhí)行如下命令查看test中的符號:
strings test
輸出結(jié)果如:
# 省略部分內(nèi)容......1111122222333334444455555# 省略部分內(nèi)容......
8、objcopy工具的使用
objcopy工具用于對目標(biāo)文件的內(nèi)容進行轉(zhuǎn)換。
objcopy工具的使用方式:
objcopy [option] [file]
如使用如下命令可以刪除可執(zhí)行程序test中的.data段輸出到test_rm:
objcopy test -R .data test_rm
objcopy配合-R參數(shù)的使用可以達(dá)到類似strip工具的效果,給程序進行瘦身。
GDB的基本使用
GDB(GNU Debugger)是一個強大的命令行調(diào)試工具。在Linux下進行開發(fā),gdb工具是必知必會的工具之一。首先,看一下gdb常用的命令:
下面以實例來進行基本使用的演示:
示例代碼gdb_test.c:
#include <stdio.h>// 測試函數(shù)1void test0(void){int i = -1;if (i = 0)printf("i = %dn", i);else if (i = 1)printf("i = %dn", i);elseprintf("i = %dn", i);}// 測試函數(shù)2void test1(void){int a[10] = {0,1,2,3,4,5,6,7,8,9};int *p = &a[1];int *p1 = (int*)(&a 1);printf("p[6] = %dn", p[6]); printf("*(p1 - 1) = %dn", *(p1 - 1));}// 主函數(shù)int main(int argc, char *argv[]){ test0(); test1(); return 0;}
這個示例代碼中有兩個測試函數(shù),其實也是兩道經(jīng)典易錯的面試筆試題。大家可以先思考一下結(jié)果是什么。下面我們使用gdb來一步一步調(diào)試及分析。
我們必須編譯出帶有調(diào)試信息(如行號等信息)的可執(zhí)行文件才能使用gdb進行調(diào)試。在以上基礎(chǔ)上加個-g參數(shù)即可生成調(diào)試信息。
除此之外,我們編譯時應(yīng)不使用優(yōu)化選項,若使用優(yōu)化,則編譯器會對程序進行一些優(yōu)化,有可能會更改語句的順序及優(yōu)化一些變量,從而可能會導(dǎo)致程序執(zhí)行流程與源碼流程不匹配的情況。可以使用-Wall參數(shù)打開所有警告,我們的編譯命令變?yōu)椋?/p>
gcc -g -Wall gdb_test.c -o gdb_test
使用上面的編譯命令編譯得到帶調(diào)試信息的可執(zhí)行程序gdb_test,有兩種方法啟動調(diào)試。
一種方法是先輸入gdb命令進入gdb環(huán)境,再輸入file 可執(zhí)行程序裝入調(diào)試文件,即:
另一種方法是直接輸入gdb 可執(zhí)行程序?qū)υ摮绦蜻M行調(diào)試,即:
1、調(diào)試測試函數(shù)1
上面的測試函數(shù)1大家思考得出結(jié)果了嗎?我們單步調(diào)試看看結(jié)果是怎么樣的:
① 在test1函數(shù)入口打個斷點:
② 運行到斷點處:
③ 單步往下執(zhí)行:
顯然,單步運行到了這一句我們就得出了測試函數(shù)1的結(jié)果,即輸出 i = 1。大家分析得對了嗎?這要是不注意還真的容易出錯,這里的if判斷條件里用的是=號,而不是==號,這個小陷阱可能會迷惑一些初學(xué)C語言的朋友。
if語句的通用形式為:
if (expression)statement
可以明確的是:如果對expression為真(非0),則執(zhí)行statement。本題中,如if (i = 0)其實就等價于
i = 0;if (i)
顯然這里的if語句的expression為假,不會執(zhí)行statement。
類似的if (i = 1)等價于
i = 1;if (i)
顯然這里的if語句的expression為真,執(zhí)行statement。
平時在發(fā)現(xiàn)自己寫的代碼執(zhí)行的流程異常時,不妨debug調(diào)試一下,一步一步地走,看程序是否按照自己設(shè)計的流程走,看是不是我們的執(zhí)行邏輯設(shè)計錯了。
2、調(diào)試測試函數(shù)2
測試函數(shù)2也是一道極其經(jīng)典的面試題目。不能一眼看出結(jié)果?沒關(guān)系,我們一起調(diào)試分析一下。接著上面的流程,我們輸出quit命令推出gdb環(huán)境,再重新進入調(diào)試test2。
① 在test2函數(shù)入口打個斷點:
② 運行到斷點處:
此時,我們不妨看一下a[1]元素的地址及a數(shù)組里面的內(nèi)容是什么:
可見,在數(shù)組初始化之前,整個數(shù)組空間里的值是一些隨機值。這里反映一個問題,局部變量在初始化之前的值是無規(guī)律的,所以不妨在定義局部變量的時候初始化一個確定的值,防止出錯。
③ 單步往下執(zhí)行:
此時,我們來看一下,指針變量p的值、a數(shù)組里的值:
因為此時第20行這條語句還未執(zhí)行,所以p指向的地址還不是a[1]元素的地址。
再單步往下執(zhí)行,然后我們看一下,指針變量p的值,及以指針變量p的值為首地址、往后偏移10個內(nèi)存單元為結(jié)束地址,這一段空間內(nèi)的值是什么:
至此,我們通過調(diào)試清晰地得到了p[6]的值。
繼續(xù)單步往下執(zhí)行,我們看一下,&a[0]的值、&a的值、(&a 1)的值、p1的值:
從gdb輸出的信息我們知道&a的類型是(int (*) [10] ),即是一個指向含有10個元素的整形數(shù)組的指針,所以(&a 1)的意義是往后偏移10 * sizeof(int)。進一步,再利用一下其它輸出的信息:
&a的值為0x7fffffffdda0&a 1的值為0x7fffffffddc8
兩個值相減得到40,正好是整個數(shù)組所占的字節(jié)數(shù)。
而p1是一個整形指針,所以p1-1指向的就是往前偏移sizeof(int)個字節(jié)的地址,即a[9]的地址(0x7fffffffddc4),所以*(p1 - 1)的值也就是a[9]的值。最后我們再看一下&a往后的40個地址里的值都是些什么:
以上就是本次的實例演示,只是用到了一小部分gdb的命令,還有更多命令大家可以自己練習(xí)使用,基本的會了,不懂的地方遇到的時候再查也來得及。
可能寫得有些亂,但也希望能對大家有幫助。總之,對于一些不確定的知識點或者程序的執(zhí)行與預(yù)期不相符時,不妨調(diào)試一下,一步一步看數(shù)據(jù)有沒有異常。
另外,這里使用vscode gdb命令行來對gdb命令做了基本演示,我們大致知道這么一回事就可以。實際中純命令行調(diào)試的話,著實讓人頭疼,我們可以vscode gdb配置一個可視化的調(diào)試環(huán)境,提高我們的調(diào)試效率。
以上就是本次的分享,如果文章對你有幫助,麻煩幫忙三連支持,謝謝!
大家對于文章有什么建議的話也可以留言交流!
巨人的肩膀:
https://baike.baidu.com/item/glibc/10058561?fr=aladdin
https://blog.csdn.net/yasi_xi/article/details/9899599
https://blog.csdn.net/zhengnianli/article
摩爾線程推出國產(chǎn)全功能GPU蘇堤:耗時僅18個月就可量產(chǎn)上市
產(chǎn)品的國產(chǎn)化的趨勢愈演愈烈:近年來,從華為的國產(chǎn)開源操作系統(tǒng)“鴻蒙”到國產(chǎn)自主研發(fā)的首款內(nèi)生安全交換芯片“玄武”等CPU、存儲芯片等零部件,中國廠商的崛起與努力被更多人看在了眼里,也在國際上得到了認(rèn)可。
近日由國產(chǎn)企業(yè)自主研發(fā)設(shè)計的GPU在首都北京市正式登場,這款新生兒GPU蘇堤從“出生”到量產(chǎn)上市僅僅用了18個月,其背后的公司到底擁有怎樣的背景呢?摩爾線程公司由創(chuàng)始人張建中于2020年10月選址在北京正式成立,成立一個月后就宣布成功拿下了A輪20億元的融資,這20億元的投資是由前海母基金、五源資本、建銀國際、湖北高質(zhì)量發(fā)展產(chǎn)業(yè)基金、上海國盛資本、中銀國際旗下渤海中盛基金聯(lián)合領(lǐng)投、招商證券等九家知名金融機構(gòu)聯(lián)合融資。創(chuàng)始人張建中曾任英偉達(dá)中國區(qū)總經(jīng)理、全球副總裁,在英偉達(dá)任職時長達(dá)15年,于2020年9月,選擇離開英偉達(dá),并于次月創(chuàng)辦了摩爾線程這家公司。
談芯片離不開架構(gòu),架構(gòu)對于芯片的作用是奠基石一般的存在:蘇堤作為國產(chǎn)第一代全功能GPU芯片,所采用的的架構(gòu)是MT Unified System Architecture,中文名叫做統(tǒng)一系統(tǒng)架構(gòu),英文名多用首字母縮寫MUSA。蘇堤作為全功能的芯片,一方面是因為MUSA架構(gòu)中包含統(tǒng)一的驅(qū)動程序框架、軟件運行庫、指令集架構(gòu)、編程模型、芯片架構(gòu),這也就是說如果用MUSA來做開發(fā)的話,還可以在云端等大多數(shù)的計算平臺運行;另一方面則取決于這款芯片內(nèi)置的AI計算加速、智能多媒體、現(xiàn)代圖形渲染、科學(xué)計算與物理仿真四大引擎。張建中在發(fā)布會中表示,隨著GPU蘇堤的問世,摩爾線程公司將以最快的速度實現(xiàn)其量產(chǎn)交付,也會繼續(xù)進行多功能GPU的研發(fā)設(shè)計。
有相關(guān)人士提問張建中:為什么要離開英偉達(dá)做這些?張建中則表示因為元計算時代已然開啟。張建中從零到有作出了成績,但是后續(xù)產(chǎn)品的研發(fā)設(shè)計也要一直在線才能保證國產(chǎn)的質(zhì)量。在未來,還是很值得期待摩爾線程公司能為元計算時代帶來多少進步與驚喜。
4096 核,32GB 顯存!摩爾線程發(fā)布全新元計算架構(gòu) MUSA 和 GPU 產(chǎn)品
2022 年 3 月 30 日,摩爾線程在北京中關(guān)村國家自主創(chuàng)新示范區(qū)會議中心舉辦了主題為“元動力 創(chuàng)無限”的春季發(fā)布會。摩爾線程創(chuàng)始人兼 CEO 張建中解讀了“元計算”這一產(chǎn)業(yè)趨勢,并發(fā)布全新架構(gòu)及系列重磅新品,包括:MUSA(Moore Threads Unified System Architecture)統(tǒng)一系統(tǒng)架構(gòu);基于 MUSA 架構(gòu)打造的第一代多功能 GPU 芯片“蘇堤”;面向 PC 和工作站的桌面級顯卡 MTT S60 和專為數(shù)據(jù)中心打造的圖形渲染和計算卡 MTT S2000;GPU 物理引擎 AlphaCore ;DIGITALME 數(shù)字人解決方案;及助力數(shù)字經(jīng)濟發(fā)展的多個元計算應(yīng)用解決方案。
發(fā)布會現(xiàn)場,摩爾線程還演示了基于其 MUSA 架構(gòu)多功能 GPU 的豐富應(yīng)用,覆蓋數(shù)字辦公、影音娛樂、工業(yè)和建筑設(shè)計、地理信息系統(tǒng)、云桌面、云游戲等多個場景,充分展示了摩爾線程產(chǎn)品的廣泛應(yīng)用性,以及為數(shù)字經(jīng)濟加速提供的強勁動力。來自政府、高校、開發(fā)者、生態(tài)合作伙伴和行業(yè)客戶以及媒體的眾多嘉賓,共同見證了摩爾線程這一重要時刻。
摩爾線程是誰?
摩程線程成立于 2020 年 10 月,創(chuàng)始人是前英偉達(dá)公司全球副總裁、中國區(qū)總經(jīng)理張建中。摩爾線程是一家以 GPU 芯片設(shè)計為主的集成電路高科技公司,專注于研發(fā)設(shè)計全功能 GPU 芯片及相關(guān)產(chǎn)品,公司致力于創(chuàng)新面向元計算應(yīng)用的新一代 GPU,構(gòu)建融合視覺計算、3D 圖形計算、科學(xué)計算及人工智能計算的綜合計算平臺,建立基于云原生 GPU 計算的生態(tài)系統(tǒng),助力驅(qū)動數(shù)字經(jīng)濟發(fā)展。
在此次發(fā)布會上,摩爾線程首次提出了“元計算”這一概念。元計算是支撐包括元宇宙在內(nèi)的下一代互聯(lián)網(wǎng)應(yīng)用的通用算力平臺,以圖形計算和 AI 計算為基石,是物理世界數(shù)字化和數(shù)字世界物理化的底層算力支撐,將為數(shù)字經(jīng)濟開辟更廣闊的發(fā)展空間。
摩爾線程創(chuàng)始人兼 CEO 張建中表示:“元計算時代已然開啟,多功能 GPU 是元計算的算力基礎(chǔ)設(shè)施,也是我們創(chuàng)新的原點。摩爾線程致力于面向元計算應(yīng)用的新一代 GPU 創(chuàng)新,構(gòu)建融合視覺計算、3D 圖形計算、科學(xué)計算及人工智能計算的通用計算平臺,建立基于云原生 GPU 計算的生態(tài)系統(tǒng),助力數(shù)字經(jīng)濟發(fā)展。此次系列新品的發(fā)布,是公司發(fā)展的重大里程碑,更是我們研發(fā)實力、生態(tài)凝聚力和創(chuàng)新執(zhí)行力的集中體現(xiàn)。”
發(fā)布 MUSA 統(tǒng)一系統(tǒng)架構(gòu)及第一代芯片“蘇堤”
在介紹完“元計算”概念后,張建中發(fā)布的一系列新產(chǎn)品將發(fā)布會推向了高潮。據(jù)張建中介紹,MUSA 是摩爾線程產(chǎn)品系列采用的統(tǒng)一系統(tǒng)架構(gòu),包括統(tǒng)一的編程模型、軟件運行庫、驅(qū)動程序框架、指令集架構(gòu)和芯片架構(gòu)。
與此同時,基于 MUSA 統(tǒng)一系統(tǒng)架構(gòu)打造的第一代摩爾線程多功能 GPU 芯片——蘇堤正式亮相。芯片內(nèi)置現(xiàn)代圖形渲染引擎、智能多媒體引擎、AI 計算加速引擎、物理仿真及科學(xué)計算四大引擎,旨在以先進的現(xiàn)代 GPU 架構(gòu)、廣泛的平臺通用性和全棧計算能力,滿足數(shù)字經(jīng)濟云邊端多元算力需求。
下一代多平臺 GPU 物理引擎 AlphaCore
AlphaCore 是由摩爾線程獨立設(shè)計研發(fā)的下一代多平臺 GPU 物理仿真系統(tǒng),能夠?qū)ξ锢硎澜缰袕?fù)雜的固體、柔性體、流體等效果進行超高精度的物理仿真處理,通過運算模擬,讓布料、毛發(fā)和數(shù)字角色軟體肌肉組織的物理交互效果達(dá)到電影級別般真實。
AlphaCore 物理引擎憑借強大的材料力學(xué)模塊,可以實現(xiàn)豐富的材料交互動態(tài)效果,例如:彈塑性材料、各項異性材料、羽絨服、皮革、絲綢、綿綸等。基于 AlphaCore 開發(fā)的系列工具包括:布料毛發(fā)制作工具——VeraFiber;氣體流體仿真工具——Catalyst;以及生物仿生計算工具——Bionics。對比 Houdini Vellum 的軟體毛發(fā)布料和 PyroFX 的煙火流體, AlphaCore 均有 5~10 倍的性能提升。
同時,AlphaCore 也提供了多平臺兼容版本,以最大程度兼容現(xiàn)有生態(tài)中的 Vulkan、CUDA、DirectX 等 Runtime API 環(huán)境,及 Houdini,Unreal,Unity 和 D5 游戲引擎和設(shè)計軟件,廣泛覆蓋影視后期制作、動畫、游戲、建筑表現(xiàn)等領(lǐng)域的實際應(yīng)用場景。
發(fā)布面向 PC 和工作站的桌面級顯卡 MTT S60
發(fā)布會上,基于 MUSA 統(tǒng)一系統(tǒng)架構(gòu)的摩爾線程全新第一代桌面級顯卡 MTT S60 首發(fā),成為全場焦點。作為摩爾線程首款突破性多功能智能顯卡,MTT S60 顯卡主要面向 PC 和工作站,憑借其優(yōu)秀的主流圖形能力、廣泛的 AI 算法支持、突破性的視頻處理能力、以及獨特的綠色能效技術(shù),能夠為圖形渲染、數(shù)字辦公、影音娛樂、智能制造 CAD/CAE、地理信息 GIS、建筑設(shè)計 BIM、視頻編輯、人工智能應(yīng)用以及主流游戲等娛樂需求提供強勁算力支持。
MTT S60 顯卡基于 MUSA 統(tǒng)一系統(tǒng)架構(gòu) GPU 蘇堤核心晶片制成,采用 12nm 制程,包含 2048 個 MUSA 核心,單精度浮點運算最高可達(dá) 6TFLOPS,像素填充率為 192G Pixel/s,搭載 8GB 顯存,支持 4K/8K 高清顯示。MTT S60 顯卡不僅支持主流的 H.264 和 H.265 編碼格式,還領(lǐng)先業(yè)內(nèi)同類產(chǎn)品提供對 AV1 視頻格式的硬件編碼支持;而在硬件解碼方面,則支持 AV1、H.264、H.265 等諸多格式的硬件解碼。不僅如此,MTT S60 顯卡還支持 DirectX、Vulkan、OpenGL 和 OpenGL ES 等眾多圖形 API 接口,可滿足各類高圖形負(fù)載應(yīng)用對 2D 和 3D 圖形渲染的需求。
MTT S60 的推出使得摩爾線程成為率先支持 Windows10 操作系統(tǒng)的 GPU 公司。MTT S60 顯卡優(yōu)異的圖形性能亦可滿足電子競技用戶的電子競技游戲需求。不僅可以在 Windows10 操作系統(tǒng)、1080P 分辨率、最高畫質(zhì)環(huán)境下為《英雄聯(lián)盟》電子競技玩家提供流暢游戲體驗,也可以在國產(chǎn) Linux 操作系統(tǒng)環(huán)境下,完成《反恐精英:全球攻勢》、《刀塔 2》等多款熱門游戲的流暢運行。
目前,摩爾線程 MTT S60 支持英特爾、AMD、龍芯、飛騰、兆芯等主流 CPU 以及 Windows、麒麟、統(tǒng)信、Ubuntu 等操作系統(tǒng),并且已經(jīng)著手與眾多 PC 合作伙伴開展合作,包括聯(lián)想、浪潮、清華同方、長城超云等(排名不分先后)。與此同時,多家合作伙伴基于 MTT S60 顯卡打造的行業(yè)應(yīng)用在現(xiàn)場進行了演示,包括:金山辦公、小魚易連、太極圖形、中望 CAD、廣聯(lián)達(dá)、D5、蒼穹數(shù)碼、超圖軟件、易智瑞、中地數(shù)碼、OSG 社區(qū)和 Gala Sports 等。
生態(tài)協(xié)作始終是推動產(chǎn)業(yè)和體驗升級的關(guān)鍵所在。因此,摩爾線程發(fā)起并攜手眾多行業(yè)合作伙伴共建中國“完美體驗系統(tǒng)聯(lián)盟(PES 聯(lián)盟)”, 旨在通過產(chǎn)品規(guī)劃、研發(fā)、最終生產(chǎn)階段的協(xié)同合作,聚焦統(tǒng)一標(biāo)準(zhǔn)、整合資源、分享技術(shù)等,為生態(tài)伙伴創(chuàng)造更多價值,為終端用戶打造完美體驗。
專為數(shù)據(jù)中心打造的 MTT S2000
摩爾線程基于 MUSA 統(tǒng)一系統(tǒng)架構(gòu)蘇堤核心晶片打造的數(shù)據(jù)中心級多功能 GPU 產(chǎn)品 MTT S2000,同樣引人注目。摩爾線程 MTT S2000 內(nèi)置渲染、音視頻編解碼、人工智能加速和并行計算等硬件模塊,能夠提供圖形圖像渲染、視頻云處理、AI 和科學(xué)計算在內(nèi)的全棧功能。憑借其獨特的渲染、虛擬化等能力和廣泛的生態(tài)支持,MTT S2000 可以在云桌面、安卓云游戲、視頻云、云渲染和 AI 推理計算加速等應(yīng)用場景全面助力綠色數(shù)字經(jīng)濟發(fā)展。
MTT S2000 采用 12nm 制程,使用 4096 個 MUSA 核心,最大配置 32GB 顯存,單精度算力最高可達(dá)到 12TFlops,支持 H.264、H.265、AV1 多路高清視頻編解碼,以及廣泛的 AI 模型算法加速,支持 PyTorch、Tensorflow、PaddlePaddle 等主流深度學(xué)習(xí)框架。為提升 MUSA 架構(gòu)產(chǎn)品在實際生產(chǎn)環(huán)境中的表現(xiàn),摩爾線程還為 MTT S2000 系列產(chǎn)品推出了針對硬件架構(gòu)進行專門優(yōu)化的統(tǒng)一編程模型、運行庫、驅(qū)動等軟件工具,可方便開發(fā)人員完成應(yīng)用的移植和適配,充分調(diào)用 MTT S2000 的硬件資源和算力。MTT S2000 支持 OpenGL、OpenGL ES、DirectX、Vulkan 等圖形 API;通過 FFMPEG 和 VA-API/DXVA 等兼容支持音視頻處理生態(tài);并通過 OpenCL 及 Vulkan 滿足 AI 和科學(xué)計算的程序兼容。
目前,摩爾線程 MTT S2000 已支持 x86 和 ARM 架構(gòu) CPU,服務(wù)器合作伙伴包括浪潮、新華三、聯(lián)想、清華同方、長城超云、思騰合力等 OEM(排名不分先后)。現(xiàn)場還宣布了摩爾線程將與蔚領(lǐng)時代、聲網(wǎng)和一流科技等在云游戲、音視頻編解碼和異構(gòu)分布式計算方面的合作伙伴共同投入研發(fā),攜手建設(shè)生態(tài),打造最優(yōu)化的行業(yè)解決方案。此外,摩爾線程還與浪潮展開了元腦生態(tài)的戰(zhàn)略合作,共同推進產(chǎn)業(yè) AI 化的發(fā)展。
隨著摩爾線程對創(chuàng)新的不懈追求,其產(chǎn)品和解決方案也將不斷擴展和升級,將為更多行業(yè)提供更強大的核心動力,與更廣泛的合作伙伴在數(shù)字經(jīng)濟大潮中合作共贏。
了解更多軟件開發(fā)與相關(guān)領(lǐng)域知識,點擊訪問 InfoQ 官網(wǎng):https://www.infoq.cn/,獲取更多精彩內(nèi)容!
核酸檢測結(jié)果匯總統(tǒng)計助手功能上線 批量統(tǒng)計核酸報告有神器了
為積極服務(wù)企業(yè)復(fù)工復(fù)產(chǎn)、學(xué)校復(fù)學(xué)復(fù)課,天津市委網(wǎng)信辦、市大數(shù)據(jù)管理中心最新研發(fā)上線核酸檢測結(jié)果匯總統(tǒng)計助手功能。從今日起,企業(yè)、學(xué)校等相關(guān)管理人員可隨時使用該功能,將匯總的多人次批量核酸檢測報告截圖自動生成為表格,方便您快速掌握員工、學(xué)生等核酸檢測結(jié)果情況,省時省力且能保障數(shù)據(jù)安全。
核酸檢測結(jié)果匯總統(tǒng)計助手功能為單機版程序,提取核酸檢測結(jié)果截圖中的姓名、脫敏身份證號碼、采樣時間、檢測機構(gòu)、檢測結(jié)果等信息后,自動生成excel文件。讀取到的圖片信息無需上傳至云端服務(wù)器,不存在信息采集和泄露個人隱私的風(fēng)險,從而有效保障個人信息安全。
核酸檢測結(jié)果匯總統(tǒng)計助手功能這么用
一、安裝
第一步:下載程序。在瀏覽器中輸入地址:https://dj.tjcac.gov.cn/tj ,點擊天津市核酸檢測結(jié)果匯總統(tǒng)計助手(Windows版本-含依賴包),下載程序。
程序下載頁面
第二步:安裝程序。雙擊“Tjtj-net.exe”程序,按照提示逐步安裝。安裝完成后,桌面會自動顯示“核酸檢測結(jié)果統(tǒng)計助手”快捷方式。
“核酸檢測結(jié)果統(tǒng)計助手”圖標(biāo)
如雙擊圖標(biāo)不能運行,請安裝對應(yīng)的依賴程序:安裝net4.8、安裝微軟C 運行庫。
依賴程序(.net4.8 ,C 運行庫)圖標(biāo)
二、收集員工、學(xué)生等相應(yīng)核酸檢測結(jié)果
1. 本程序僅支持識別通過“健康天津”APP和“津心辦”APP查詢的核酸檢測結(jié)果截圖。
2. 核酸檢測結(jié)果截圖務(wù)必包括:頁面說明、個人信息、檢測結(jié)果三部分。
3. 圖片格式支持:jpg、jpeg、bmp三種格式;
4. 截圖要嚴(yán)格按照圖例截圖,否則將無法識別。
核酸檢測結(jié)果圖例
三、一鍵生成匯總表格文件
第一步:打開程序。桌面---雙擊“核酸檢測結(jié)果統(tǒng)計助手”快捷方式圖標(biāo),進入功能頁面。
“核酸檢測結(jié)果統(tǒng)計助手”圖標(biāo)
功能頁面
第二步:使用程序。點擊“選擇文件夾”按鈕,選擇已保存有需生成統(tǒng)計報表的文件夾,點擊開始識別。
選擇文件夾
開始識別
第三步:查找報表。在原保存核酸檢測結(jié)果截圖的文件夾下,自動生成“文件輸出”文件夾---識別結(jié)果文件。
來源:騰訊慧政天津