用gdb理解C巨集 和

2022-06-01 12:12:13 字數 2224 閱讀 8745

在unix/linux核心**以及gnu libc源**中,有兩個c的巨集被廣泛使用。 例如:

/*

glibc-2.25/sysdeps/powerpc/powerpc64/sysdep.h

*/207

#define tostring(s) #s

208#define stringify(s) tostring(s)

209#define xglue(a,b) a##b

210#define glue(a,b) xglue(a,b)

在gdb中用命令macro定義並展開看看,

1

(gdb) help macro

2 prefix for

commands dealing with c preprocessor macros.34

list of macro subcommands:

56 macro define -- define a new c/c++preprocessor macro

7 macro expand -- fully expand any c/c++ preprocessor macro invocations in

expression

expression

9 macro list -- list all the macros defined using the `macro define'

command

10 macro undef -- remove the definition of the c/c++preprocessor macro with the given name

11 ......

12(gdb) #

13(gdb) macro define tostring(s)#s

14(gdb) macro define stringify(s) tostring(s)

15(gdb) macro define xglue(a,b) a##b

16(gdb) macro define glue(a,b) xglue(a,b)

17(gdb) #

18(gdb) macro list

19macro define glue(a, b) xglue(a,b)

20macro define xglue(a, b) a##b

21macro define stringify(s) tostring(s)

22macro define tostring(s) #s

23(gdb) #

24 (gdb) macro expand tostring(12345

)25 expands to: "

12345

"26 (gdb) macro expand tostring("

hello")

27 expands to: "

\"hello\""28

(gdb) #

29 (gdb) macro expand glue(123, 45

)30 expands to: 12345

31 (gdb) macro expand glue("

hello

", "

world")

32 expands to: "

hello

""world

"

由此可見,

可以簡記為「單#字串,雙#連線參」。

另外,也可以用"gcc -e"檢視巨集展開。例如,

1 $ cat

foo.s

2#define sys_ify(syscall_name) __nr_##syscall_name

3#define __nr_mmap 115

4#define __nr_munmap 117

56 mov $sys_ify(mmap), %eax

7 mov $sys_ify(munmap), %eax

89 $gcc -efoo.s | tail -2

10 mov $115, %eax

11 mov $117, %eax

12 $

用gdb除錯C與C 程式

1.gdb簡介 1 介紹 gdb是linux下乙個gnu除錯程式,是用來除錯c與c 程式的強力偵錯程式。能夠讓使用者在程式執行時觀察程式的內部結構和記憶體的使用情況。2 功能 按照自定義的方式啟動執行需要除錯的程式。可以使用指定位置和條件表示式的方式來設定斷點。程式暫停時的值的監視。動態改變程式的執...

C 的巨集和 C 的巨集

總結一下c和c 的巨集。大家經常使用的其實都是c中的巨集,但是c 都延續了下來,先回顧一下。define 定義巨集 undef 取消巨集 include 包含標頭檔案 ifdef 如果巨集已經定義,則返回真 ifndef 如果巨集沒有定義,則返回真 if 如果條件為真,則執行下面的 else 與 i...

用gdb除錯C 的cgi

1.編譯 把編譯檔案中的 strip去掉,如果makefile中含有 增加 g選項 2.環境變數的設定 cgi輸入的變數引數,一般通過環境變數來設定。這點是除錯cgi跟除錯普通c 程式的主要區別。cgi的輸入引數,在cgi中,是通過讀取環境變數來實現的。1 可以在shell中用export設定 on...