【问题标题】:Problem debugging a macro in visual studio在 Visual Studio 中调试宏时出现问题
【发布时间】:2011-06-30 16:31:40
【问题描述】:

我在调试 C 中的宏时遇到问题。当我尝试设置断点时,我收到消息:“断点不会被命中。没有与此行关联的可执行代码......”有趣的是我可以调试文件中的所有其他内容,而不是这个宏。我已正确加载所有符号文件,清理并重建,并关闭优化。关于为什么调试此宏不起作用的任何想法?

【问题讨论】:

  • 调试宏已经被我击中或错过,我尽量避免使用它们。您会很幸运地将宏扩展为源代码并进行调试,然后当它正常运行时,您可以将其放回宏形式。
  • 我试过了,到目前为止它正在工作......感谢您的帮助!

标签: c visual-studio-2008 debugging macros


【解决方案1】:

不了解足够的上下文(查看定义、调用以及尝试设置断点的位置可能会有所帮助),这里有一些猜测:

你是在宏定义中设置断点还是在它被调用的地方设置断点? 如果您在定义中设置它,那么这正是您会看到的错误。 定义告诉预处理器在代码中的其他地方进行替换,因此当代码到达编译器时,上面带有#define 的行已被替换为空行。

如果您在使用断点时正确设置了断点,您确定您使用的是您认为的宏的定义,并且该宏不是有条件地编译为不生成代码吗? 这是禁用某些东西(例如调试输出)的常用方法,并且在调用它的行上不会给出可执行代码(除非它周围有其他可执行代码)。 检查这一点的一种方法是在宏定义旁边放置一个#error 行 - 如果正在使用它,那么编译器将吐出一个错误。

请记住,宏函数只是文本替换,因此调用它们会将它们的所有代码放在调用的一行(每次调用)。您实际上无法调试它们(在单步执行的意义上)一个“多行”宏函数),您只能跳过它们比较前后状态。这是复杂的宏函数可能不是一个好主意的主要原因之一。

【讨论】:

  • 好的,是的,正在尝试逐步进行多行调试。我想我并没有真正理解宏到底做了什么。感谢您的洞察力!
  • 认为预处理器是一个稍微强大的查找和替换,仅此而已。这既是好事也是坏事。你发现了一件坏事。告诉 Visual Studio 输出中间(预处理)文件可能很有指导意义,这样您就可以看到实际结果是什么 [Project Properties=>C/C++=>Preprocessor=>Generate preprocessed file]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
相关资源
最近更新 更多