導航:首頁 > 源碼編譯 > 看go源碼函數調用關系圖

看go源碼函數調用關系圖

發布時間:2022-08-02 08:00:07

java函數調用關系圖用什麼工具畫

visio2003 有各種模板,但畫出來比較簡單,而且也粗糙,如果畫給自己用的,用visio也可以滿足要求,如果是畫給別人看的可以用rational rose 比較漂亮,看著也專業

㈡ 請問查看源代碼調用結構圖的軟體叫什麼

source insight 代碼閱讀和編輯軟體建議試一下,可以實時生成該圖

doxygen可以根據項目代碼靜態生成源代碼調用結構圖

㈢ 函數調用關系圖可以提供哪些與測試有關的信息

繪制函數調用關系圖對理解大型程序大有幫助。我想大家都有過一邊讀源碼(並在頭腦中維護一個調用棧),一邊在紙上畫函數調用關系,然後整理成圖的經歷。如果運氣好一點,藉助調試器的單步跟蹤功能和call stack窗口,能節約一些腦力。

不過如果要分析的是腳本語言的代碼,那多半隻好老老實實用第一種方法了。如果在讀代碼之前,手邊就有一份調用圖,豈不妙哉?下面舉出我知道的幾種免費的分析C/C++函數調用關系的工具。

函數調用關系圖(call graph)是圖(graph),而且是有向圖,多半還是無環圖(無圈圖)——如果代碼中沒有直接或間接的遞歸的話。Graphviz是專門繪制有向圖和無向圖的工具,所以很多call graph分析工具都以它為後端(back end)。那麼前端呢?就看各家各顯神通了。

調用圖的分析分析大致可分為「靜態」和「動態」兩種,所謂靜態分析是指在不運行待分析的程序的前提下進行分析,那麼動態分析自然就是記錄程序實際運行時的函數調用情況了。

靜態分析又有兩種方法,一是分析源碼,二是分析編譯後的目標文件。

分析源碼獲得的調用圖的質量取決於分析工具對編程語言的理解程度,比如能不能找出正確的C++重載函數。Doxygen是源碼文檔化工具,也能繪制調用圖,它似乎是自己分析源碼獲得函數調用關系的。GNU cflow也是類似的工具,不過它似乎偏重分析流程圖(flowchart)。

對編程語言的理解程度最好的當然是編譯器了,所以有人想出給編譯器打補丁,讓它在編譯時順便記錄函數調用關系。CodeViz(其靈感來自Martin Devera (Devik) 的工具)就屬於此類,它(1.0.9版)給GCC 3.4.1打了個補丁。

另外一個工具egypt的思路更巧妙,不用大動干戈地給編譯器打補丁,而是讓編譯器自己mp出調用關系,然後分析分析,交給Graphviz去繪圖。不過也有人另起爐灶,自己寫個C語言編譯器(ncc),專門分析調用圖,勇氣可嘉。不如要是對C++語言也這么干,成本不免太高了。分析C++的調用圖,還是藉助編譯器比較實在。

㈣ source insight能不能查看不同包,不同源文件之間的調用或者引用狀況以形成關系圖

菜單View -> Relation Window 打開後可以看到當前函數所調用的函數關系,具體顯示多少層可以進行設置。是樹狀結構,應該會有幫助。

㈤ 想畫一個圖整理一下程序裡面的函數調用關系用什麼軟體比較方便

pdf" data_size="3.88M" data_filelogo="https://gss0.bdstatic.com//yun-file-logo/file-logo-6.png" data_number="1" data_sharelink="https://pan..com/share/link?shareid=388980&uk=959191099" data_code="">

你是不是要找這個: http://ke..com/view/782970.htm 剛用過,太好了 說明書 軟體直接在新浪愛問中搜rar格式的understand即可 ps(csdn收積分呃),還是愛問好呵呵

㈥ 如何使用go調用dll函數

1、創建dll: 在.cpp頭部加上如下語句:#define DLLEXPORT __declspec(dllexport) 2、實現函數:DLLEXPORT int Add(int first,int second) { return (first+second); } 3、 使用Dll:在要使用該dll中函數的頭文件中加入: #define DLLIMPORT __declspec(dllimport) #pragma comment(lib,"cal.lib") DLLIMPORT int Add(int first,int second); 4、 如果使用了新建頭文件,則包含該頭文件再引用dll中的函數。 二、導出class的DLL 1、 在要導出的dll中,右鍵點擊ClassView的根目錄->New Class->Generic,添加一新類CRectArea 2、 在新添加類頭文件中加入:#define DLLEXPORT __declspec(dllexport) 3、 在類前加入DLLEXPORT:class DLLEXPORT CRectArea{…}; ...

㈦ 嵌入式 linux 啟動U-Boot與內核的關系中的go指令調用的下面的函數是完成什麼功能求注釋,一定採納

/* common/cmd_boot.c */
int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
ulong addr, rc;
int rcode = 0;
if (argc < 2) {
printf ("Usage:\n%s\n", cmdtp->usage);
return 1;
}
addr = simple_strtoul(argv[1], NULL, 16); /* go的用法是:go addr, addr通過simple_strtoul 轉換成ulong型的地址 */
printf ("## Starting application at 0x%08lX ...\n", addr);
/*
* pass address parameter as argv[0] (aka command name),
* and all remaining args
*/
rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]); /* 轉成直接指向該地址的函數指針調用該函數 */
if (rc != 0) rcode = 1;
printf ("## Application terminated, rc = 0x%lX\n", rc);
return rcode;
}

建議你看一下函數指針,基本上應該就了解了。

㈧ go語言如何調用c函數

直接嵌入c源代碼到go代碼裡面
package main
/*
#include <stdio.h>
void myhello(int i) {
printf("Hello C: %d\n", i);
}
*/
import "C"
import "fmt"
func main() {
C.myhello(C.int(12))
fmt.Println("Hello Go");
}
需要注意的是C代碼必須放在注釋裡面
import "C"語句和前面的C代碼之間不能有空行
運行結果
$ go build main.go && ./main
Hello C: 12
Hello Go
分開c代碼到單獨文件
嵌在一起代碼結構不是很好看,很多人包括我,還是喜歡把兩個分開,放在不同的文件裡面,顯得干凈,go源文件裡面是go的源代碼,c源文件裡面是c的源代碼。
$ ls
hello.c hello.h main.go
$ cat hello.h
void hello(int);
$ cat hello.c
#include <stdio.h>
void hello(int i) {
printf("Hello C: %d\n", i);
}
$ cat main.go
package main
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go");
}
編譯運行
$ go build && ./main
Hello C: 12
Hello Go
編譯成庫文件
如果c文件比較多,最好還是能夠編譯成一個獨立的庫文件,然後go來調用庫。
$ find mylib main
mylib
mylib/hello.h
mylib/hello.c
main
main/main.go
編譯庫文件
$ cd mylib
# gcc -fPIC -shared -o libhello.so hello.c
編譯go程序
$ cd main
$ cat main.go
package main
// #cgo CFLAGS: -I../mylib
// #cgo LDFLAGS: -L../mylib -lhello
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go");
}
$ go build main.go
運行
$ export LD_LIBRARY_PATH=../mylib
$ ./main
Hello C: 12
Hello Go
在我們的例子中,庫文件是編譯成動態庫的,main程序鏈接的時候也是採用的動態庫
$ ldd main
linux-vdso.so.1 => (0x00007fffc7968000)
libhello.so => ../mylib/libhello.so (0x00007f513684c000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5136614000)
libc.so.6 => /lib64/libc.so.6 (0x00007f5136253000)
/lib64/ld-linux-x86-64.so.2 (0x000055d819227000)
理論上講也是可以編譯成整個一靜態鏈接的可執行程序,由於我的機器上缺少靜態鏈接的系統庫,比如libc.a,所以只能編譯成動態鏈接。

㈨ go中:func(r rune) bool { return r == rune(0)} r從哪裡來有點不太看得懂這個

函數的調用者把一個rune類型值傳給形參r,簡而言之,r從調用者那裡來

㈩ Golang 中函數和方法的區別

在接觸到go之前,我認為函數和方法只是同一個東西的兩個名字而已(在我熟悉的c/c++,python,java中沒有明顯的區別),但是在golang中者完全是兩個不同的東西。官方的解釋是,方法是包含了接收者的函數。到底什麼意思呢。

首先函數的格式是固定的,func+函數名+ 參數 + 返回值(可選) + 函數體。例

func main()

{

fmt.Println("Hello go")

}

在golang中有兩個特殊的函數,main函數和init函數,main函數不用介紹在所有語言中都一樣,它作為一個程序的入口,只能有一個。init函數在每個package是可選的,可有可無,甚至可以有多個(但是強烈建議一個package中一個init函數),init函數在你導入該package時程序會自動調用init函數,所以init函數不用我們手動調用,l另外它只會被調用一次,因為當一個package被多次引用時,它只會被導入一次。

閱讀全文

與看go源碼函數調用關系圖相關的資料

熱點內容
u盤加密了手機讀取不了 瀏覽:947
oracle11g啟動命令 瀏覽:931
怎麼把視頻傳到自己的文件夾 瀏覽:700
福州電動車在哪個app上搖號 瀏覽:818
禮書PDF 瀏覽:667
什麼app看本子 瀏覽:394
如何學好編譯語言 瀏覽:591
平面編程和切削 瀏覽:704
phpemoji表情符號 瀏覽:778
IBM雲平台shor演算法 瀏覽:576
程序員當乙方 瀏覽:519
php商城設計與實現的 瀏覽:305
php自動列印 瀏覽:469
哪個app多年輕人 瀏覽:902
租的伺服器如何重裝 瀏覽:937
乾眼症程序員 瀏覽:239
樂動達人安卓版有什麼游戲 瀏覽:484
c523壓縮比 瀏覽:544
命令語氣的人什麼心態 瀏覽:435
程序員喜歡留指甲嗎 瀏覽:516