【问题标题】:Segmentation Fault using C macros使用 C 宏的分段错误
【发布时间】:2013-04-08 16:10:19
【问题描述】:

在使用稍作修改的 MobileC 构建时,我遇到了一个奇怪的问题。

我在宏中遇到分段错误,但是当我将 printfs 放入代码中时(否则无法调试,因为它被 C 干扰)我无法得到它发生的确切位置。

这是代码:

...
printf("just to check there is no problem accessing "node" %d\n", node);\
printf("this will be printed\n"); \
node_type##_Destroy(node); \
printf("this will not be printed\n"); \
...

而Destroy的代码如下:

int name##_Destroy( name##_p name ) \
{ \
printf("this will not be printed\n");    \
...

我没有修改这部分代码(除了printfs)所以我想没问题。你知道这里会发生什么吗?

【问题讨论】:

  • 当您在附加调试器的情况下单步执行代码时会发生什么?段错误发生在哪一行?
  • 问题是它是C解释的,所以我不能调试它...

标签: c memory segmentation-fault free


【解决方案1】:

这段代码中有两个危险信号,但你还没有真正向我们展示足够的东西。

printf("just to check there is no problem accessing "node" %d\n", node);\
printf("this will be printed\n"); \
node_type##_Destroy(node); \
printf("this will not be printed\n"); \

这显然是一个宏,但它是一个多语句宏。这是搞砸宏的最简单方法,因为它可以这样调用:

#define MACRO() puts("A"); puts("B")
// prints "B"
if (0) MACRO();

其次,那个字符串常量很可疑:

"just to check there is no problem accessing "node" %d\n", node

注意node 据称是int,但它出现在两个字符串常量之间而没有编译错误。 int 不应该这样做,所以 node 可能不完全是 int。这可能是一个完整的表达式,谁知道呢?

【讨论】:

    【解决方案2】:

    删除时的段错误几乎总是指向损坏的堆。某些东西破坏了您的指针所在的堆(或者它正在跟踪 prev/next 指针的位置)并导致跳转到超空间。托管代码降低了这种可能性,但它仍然是我要开始的地方。

    【讨论】:

      【解决方案3】:

      感谢您的回答。现在我知道发生了什么。

      Dietrich Epp,确实 node 不是 int (我只是想知道访问它是否有问题,因为我被错误搞砸了并且没有不知道发生了什么)。 感谢您警告我有关 C 宏的信息。我对read 有点了解,最后我弄清楚发生了什么。

      node_type 类型是 agent。因此宏扩展为 agent_Destroy(node)。问题是在 Mobile C 代码中有一个名为 agent_Destroy(agent_p agent) 的函数。 发生的情况是两个函数都执行了,而第一个函数是直接在代码中定义的存在分段错误的函数。

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-24
        • 2017-08-01
        • 1970-01-01
        相关资源
        最近更新 更多