lockf. c: Нет такого файла или каталога - PullRequest
0 голосов
/ 14 марта 2020

Пожалуйста, смотрите ОБНОВЛЕНИЕ в нижней части этого поста для получения дополнительной информации.

Ниже приведена программа _pqos_api_lock из шапки. c из дистрибутива Intel CMT-CAT (технология управления кэшем - технология выделения кэша) на https://github.com/intel/intel-cmt-cat.

Функция _pqos_api_lock вызывает lockf, который определен в unistd.h, а unistd.h включен в include в верхней части файла. Однако, отлаживая с помощью gdb, я получаю «lockf. c: нет такого файла или каталога» в строке:

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, так почему я получаю эту ошибку? Я нашел источник для lockf. c в https://code.woboq.org/userspace/glibc/io/lockf.c.html - возможно, я могу связать это с моим исполняемым файлом, хотя это звучит как kludge.

Вот исходный код _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 длиной 1722 строки, поэтому я не включил все это здесь, но он доступен по ссылке выше на github - при необходимости, пожалуйста, спросите, и я опубликую все это.

I ' m в Ubuntu 18.04, и я скомпилировал с Clang.

Спасибо за любые идеи.

ОБНОВЛЕНИЕ:

В своем ответе ниже "Занятый русский" показывает, что "не может найти источник" 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");
}

The l ine "if (lockf (m_apilock, F_LOCK, 0)! = 0)" завершается неудачно, потому что согласно gdb:

p (int) F_LOCK Нет символа "F_LOCK" в текущем контексте.

То похоже на ошибку в программе, распространяемой Intel.

1 Ответ

1 голос
/ 15 марта 2020

Я включил unistd.h, так почему я получаю эту ошибку?

Вы, кажется, не понимаете значение этой ошибки (которая отсутствует *) 1006 *). Эту ошибку безопасно игнорировать, и она никак не влияет на выполнение вашей программы в .

. Причина, по которой GDB отображает эту ошибку, заключается в том, что GDB не может показать вам источник (потому что GDB не знает, где находится этот источник).

Скорее всего, вы на самом деле не хотите вообще видеть этот источник.

Я нашел источник для lockf. c в https://code.woboq.org/userspace/glibc/io/lockf.c.html

Хорошо. Если вы действительно хотите увидеть, что делает locf, вы можете посмотреть там.

возможно, я смогу связать это с моим исполняемым файлом

Функция определено в lockf.c уже связано с вашим исполняемым файлом (вы получите ошибку ссылки, если это не так). Вы не можете связать источник с вашим исполняемым файлом больше, чем можете связать с ним свою кухонную раковину.

Что вы можете сделать, это установить libc6-dbg пакет, который включает в себя исходный код для все из GLIB C, и позволяют GDB автоматически находить источники .

...