【问题标题】:Breakpoints on s390xs390x 上的断点
【发布时间】:2012-09-26 23:30:59
【问题描述】:

我在 S390x 上的 GDB 工作

我有一个基本上可以做到这一点的函数:

Item *getItemFromRef( PrimaryDataStructure pds, size_t ref ) {
    Item *returnValue = NULL;
    SecondaryDataStructure sds = getSecondaryFromPrimary(pds, ref)
    if (sds) {
        returnValue = getItemFromRefSecondary(sds, ref);
    }
    return returnValue;
}

我在getItemFromRefgetItemFromRefSecondary 上设置了断点。 getItemFromRef 断点可以正常触发,但 getItemFromRefSecondary 不会触发。这是预期的吗?有什么办法让它着火吗?我究竟做错了什么?即使我禁用了getItemFromRef 的断点,也会出现这种情况。

编辑:使用 gdb 6.8.50

【问题讨论】:

  • "getRefFromSecondary 永远不会触发" -- 你发布的代码永远不会调用 getRefFromSecondary!
  • @Robᵩ 完全正确。我更新了问题以修复断点位置的名称。

标签: c linux gdb mainframe


【解决方案1】:

我今天又看了一下符号,发现两个不同的动态库正在导入相同的函数符号,并且断点被设置为函数的错误版本。

【讨论】:

    【解决方案2】:

    getItemFromRefSecondary 是否有可能在那时被内联?它可能会在您进入时报告内联函数名称(由于调试信息),但调试器只有在它确实是函数调用时才能中断。

    您可以使用较少的优化进行编译(或不进行优化,使用-O0),或者如果这太麻烦,您可以强制该函数不与__attribute__((__noinline__)) 内联(假设您使用gcc 构建)。

    【讨论】:

    • 我必须承认我对 390 汇编器并不完全满意,但看起来getItemFromRefSecondary 有一个明确的分支。此外,该程序不是使用调试符号构建的,并且有一个明确的符号,值得。
    猜你喜欢
    • 2019-06-15
    • 2020-05-19
    • 2022-06-19
    • 2019-10-14
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2020-04-05
    • 2012-06-15
    相关资源
    最近更新 更多