Как исправить coredump для 'ProfileInfoCommand' из CLIPS? - PullRequest
0 голосов
/ 31 октября 2019

Версия CLIPS: 6.31.
язык: c++ clips C API.

Я получаю файл coredump при выполнении ProfileInfoCommand после EnvRun.
Почему происходит эта ошибка? Есть ли здесь какая-либо ошибка использования? Или это ошибка?

Код C ++ 1:

#define PROFILING_FUNCTIONS 1

// ...

EnvReset(clips);

// ...
EnvLoadFactsFromString(clips, facts.str().c_str(), -1);
// ...

EnvRun(clips, 100000);
ProfileInfoCommand(clips);

Я знаю, если PROFILING_FUNCTIONS определен как 1, функция EnvRun запуститсяпрофиль автоматически. Так что я использую ProfileInfoCommand после EnvRun, но произошел coredump!

И я также пытался использовать другой метод, но процесс также генерировал дамп ядра (такая же обратная трассировка, как у the c++ code 1).
Код C ++ 2:

EnvReset(clips);
Profile(clips, "constructs");

// ...
EnvLoadFactsFromString(clips, facts.str().c_str(), -1);
// ...

EnvRun(clips, max_iters);
Profile(clips, "off");
ProfileInfoCommand(clips);

Файл coredump выглядит следующим образом:

Core was generated by `/mnt/home/worker/project/ae-arbiter/dist/bin/arbiter-8003 --flagfile=flags.'.
Program terminated with signal 11, Segmentation fault.
#0  0x0000000000bc6b80 in EnvRtnArgCount (theEnv=Cannot access memory at address 0x7f879c3f6af8
) at /mnt/home/worker/project/ae-arbiter/src/clips/argacces.cc:306
306    for (argPtr = EvaluationData(theEnv)->CurrentExpression->argList;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.212.el6.x86_64
(gdb) bt
#0  0x0000000000bc6b80 in EnvRtnArgCount (theEnv=0x7f85e6454f70) at /mnt/home/worker/project/ae-arbiter/src/clips/argacces.cc:306
#1  0x0000000000bc6bcd in EnvArgCountCheck (theEnv=0x7f85e6454f70, functionName=0xda1188 "profile", countRelation=2, expectedNumber=1) at /mnt/home/worker/project/ae-arbiter/src/clips/argacces.cc:337
#2  0x0000000000c40803 in ProfileInfoCommand (theEnv=0x7f85e6454f70) at /mnt/home/worker/project/ae-arbiter/src/clips/proflfun.cc:245
#3  0x0000000000b62d12 in arbiter::lib::ClipsModuleExecute (clips=0x7f85e6454f70, features=..., max_iters=100000, result_func=..., module_name=..., halt=@0x7f879c3f6fdc)
    at /mnt/home/worker/project/ae-arbiter/src/lib/clips-utils.cc:357
...
...

1 Ответ

0 голосов
/ 31 октября 2019

Установка PROFILING_FUNCTIONS в 1 не приводит к автоматическому профилированию кода при вызове EnvRun. Он определяет, включены ли функции профилирования в исполняемый файл CLIPS. См. Раздел 2.2 Расширенное руководство по программированию . Функции, доступные для профилирования с помощью команды CLIPS, описаны в разделе 13.15 «Команды профилирования» Основное руководство по программированию . ProfileInfoCommand не может быть вызван напрямую. Если вы хотите вызвать команду / функцию CLIPS, которая не является частью API, описанного в Расширенном руководстве по программированию, используйте API EnvEval:

DATA_OBJECT returnValue;

EnvEval(theEnv,"(profile-info)",&returnValue);
...