我有一个宏,其定义大约有50行,并且有很多'if else'语句。此宏def'n出现在.h文件中。我在TUI模式下运行'gdb',但是当执行到达该宏时,代码窗口变为空白并仅在宏代码执行后返回。我希望逐行执行完整的宏代码。请告诉我怎么做(一种方法是用代码中的定义替换宏然后重新编译它。我不想使用这个选项,因为我的代码中有几个这样的宏)。
任何帮助将不胜感激。期待获得此问题的解决方案。如果有其他方法解决此问题而不是使用预处理文件,请告诉我?我有一个代码,几百个.c& .h文件。
答案 0 :(得分:15)
一个选项是完全预处理您的C文件,展开其中的所有宏,然后编译生成的预处理文件。
例如,考虑一下这个简单的C程序:
// file: prep.c
#include <stdio.h>
#define MY_BIG_MACRO \
int i; \
printf("integers from 0 to 9:\n"); \
for (i = 0; i < 10; i++) \
printf("%d ", i); \
printf("\n");
int main(void)
{
MY_BIG_MACRO
return 0;
}
编译它,保存临时文件(包括预处理的源代码):
gcc -Wall -O2 -g -std=c99 prep.c -o prep.exe -save-temps
这应该为您提供预处理版本的prep.c
,prep.i
(为简洁起见缩短):
# 1 "prep.c"
# 1 "C:\\MinGW\\msys\\1.0\\home\\Alex//"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "prep.c"
# 1 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.6.2/../../../../include/stdio.h" 1 3
...
int __attribute__((__cdecl__)) __attribute__ ((__nothrow__)) vswscanf (const wchar_t * __restrict__,
const wchar_t * __restrict__, __gnuc_va_list);
# 3 "prep.c" 2
# 11 "prep.c"
int main(void)
{
int i; printf("integers from 0 to 9:\n"); for (i = 0; i < 10; i++) printf("%d ", i); printf("\n");
return 0;
}
现在你要摆脱#-lines。无论如何,如果将它们留在中,它们将影响调试信息。令人惊讶的是,这意味着宏不会在gdb
中展开。
值得庆幸的是,grep
可以提供帮助(我不是grep专业人员,所以请检查params是否正确,但它们似乎适用于使用MinGW x86的Windows):
grep ^[^\#].*$ prep.i > prepi.c
这会在prep.i
中为您提供prepi.c
的剥离版本:
typedef unsigned int size_t;
typedef short unsigned int wchar_t;
typedef short unsigned int wint_t;
...
int __attribute__((__cdecl__)) __attribute__ ((__nothrow__)) vswscanf (const wchar_t * __restrict__,
const wchar_t * __restrict__, __gnuc_va_list);
int main(void)
{
int i; printf("integers from 0 to 9:\n"); for (i = 0; i < 10; i++) printf("%d ", i); printf("\n");
return 0;
}
现在你可以编译它:
gcc -Wall -O2 -g -std=c99 prepi.c -o prepi.exe
并在gdb
中运行:
gdb prepi.exe
发出以下命令:
b main
r
l
这将执行应用程序直到main()
并列出与到达的断点相关的源代码:
(gdb) b main
Breakpoint 1 at 0x40643f: file prepi.c, line 184.
(gdb) r
Starting program: C:\MinGW\msys\1.0\home\Alex\prepi.exe
[New Thread 7340.0x20c4]
Breakpoint 1, main () at prepi.c:184
184 int i; printf("integers from 0 to 9:\n"); for (i = 0; i < 10; i++) pri
ntf("%d ", i); printf("\n");
(gdb) l
179 const wchar_t * __restrict__, __gnuc_va_list);
180 int __attribute__((__cdecl__)) __attribute__ ((__nothrow__)) vswscanf (c
onst wchar_t * __restrict__,
181 const wchar_t * __restrict__, __gnuc_va_list);
182 int main(void)
183 {
184 int i; printf("integers from 0 to 9:\n"); for (i = 0; i < 10; i++) pri
ntf("%d ", i); printf("\n");
185 return 0;
186 }
(gdb)
如您所见,宏体现在处于普通视图中。
这里的一个小问题是多行宏(继续\
的那些)被扩展为一行。我还没有找到将它们扩展为多行的选项,但您可以手动执行此操作。
答案 1 :(得分:7)
“一个人不只是step
进入宏。”
您仍有几个选择:
stepi
一次执行宏一机器指令。答案 2 :(得分:1)
如果上述所有方法都不起作用,那么您应该回到大宏中使用printf/fprintf
。
我不得不处理300线MACRO,深入图书馆。这比手工编译和处理后处理文件更容易。