【问题标题】:lockf.c: No such file or directorylockf.c:没有这样的文件或目录
【发布时间】:2020-06-26 10:21:49
【问题描述】:

有关更多信息,请参阅本文底部的更新。

下面是来自英特尔 CMT-CAT 发行版(缓存管理技术 - 缓存分配技术)的 cap.c 的 _pqos_api_lock 程序,地址为https://github.com/intel/intel-cmt-cat

函数_pqos_api_lock 调用lockf,它在unistd.h 中定义,并且unistd.h 包含在文件顶部的include 中。但是,使用 gdb 进行调试时,我在以下行得到“lockf.c: No such file or directory”:

if (lockf(m_apilock, F_LOCK, 0) != 0)
          err = 1;

回到命令行,“locate lockf.c”和“find lockf.c”弹出:

find: ‘lockf.c’: No such file or directory

我已包含 unistd.h,为什么会出现此错误?我在https://code.woboq.org/userspace/glibc/io/lockf.c.html 找到了lockf.c 的源代码——也许我可以将它链接到我的可执行文件中,尽管这听起来像是一个杂牌。

这里是_pqos_api_lock的源代码:

#include <stdlib.h>
[ other includes omitted ]

void _pqos_api_lock(void)
{
        int err = 0;

        if (lockf(m_apilock, F_LOCK, 0) != 0)
                err = 1;

        if (pthread_mutex_lock(&m_apilock_mutex) != 0)
                err = 1;

        if (err)
                LOG_ERROR("API lock error!\n");
}

cap.c 的完整源代码长达 1,722 行,因此我没有在此处包含所有内容,但可以在上面的 github 链接中找到它——如果需要,请询问,我会全部发布。

我在 Ubuntu 18.04 上,使用 Clang 编译。

感谢您的任何想法。

更新:

在下面的回答中,Employed Russian 表明“找不到源 lockf.c”是一条 gdb 消息,表明它无法访问 lockf.c。但是,现在出现错误:

void _pqos_api_lock(void)
{
        int err = 0;

        if (lockf(m_apilock, F_LOCK, 0) != 0)
                err = 1;

        if (pthread_mutex_lock(&m_apilock_mutex) != 0)
                err = 1;

        if (err)
                LOG_ERROR("API lock error!\n");
}

"if (lockf(m_apilock, F_LOCK, 0) != 0)" 行失败,因为根据 gdb:

p (int) F_LOCK 当前上下文中没有符号“F_LOCK”。

这看起来像是英特尔分发的程序中的错误。

【问题讨论】:

    标签: c gdb glibc


    【解决方案1】:

    我已包含 unistd.h,为什么会出现此错误?

    您似乎不了解此错误的重要性(none)。此错误可以安全忽略,并且不会以任何方式影响您的程序的执行

    GDB 显示此错误的原因是 GDB 无法向您显示源(因为 GDB 不知道该源在哪里)。

    很有可能,您实际上根本看到这个来源。

    我在https://code.woboq.org/userspace/glibc/io/lockf.c.html找到了lockf.c的源代码

    很好。如果你真的想看看locf 做了什么,你可以去那里看看。

    也许我可以将它链接到我的可执行文件中

    lockf.c 中定义的函数已经链接到您的可执行文件中(如果没有链接,您会收到链接错误)。您不能将源代码链接到可执行文件中,就像您不能将厨房水槽链接到它一样。

    你可以做的是install libc6-dbg 包,其中包含所有 GLIBC 的源代码,并且 允许 GDB 找到源代码自动

    【讨论】:

    • 感谢您解释这是一个 gdb 错误(没有源文件)。但我现在得到的错误是:“程序收到信号 SIGSEGV,分段错误。lockf.c:39 39 lockf.c 处的 lockf (fd=4, cmd=1, len=0) 中的 0x00007ffff78f07c8:没有这样的文件或目录。 "
    • 所以它在一个不存在的文件的第 39 行发现了一个错误。
    • “你不能将源代码链接到你的可执行文件中”——不完全正确。将 .c 文件编译为 .o 文件,然后将 .o 文件链接到您的最终可执行文件中。我使用链接到我的 nasm 源的其他 C 程序来执行此操作。但是,正如您所指出的,这里没有必要,也无济于事。
    • @RTC222 “这看起来像是英特尔分发的程序中的错误。” ——不,它没有。看来您不了解宏的工作原理。如果您在理解 SIGSEGV 时需要帮助,请使用分段故障标签提出不同的问题,并提供 GDB whereinfo registers 命令的完整输出。
    猜你喜欢
    • 2021-06-24
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2016-05-06
    • 2019-03-13
    相关资源
    最近更新 更多