redhawk 模块服务函数使用示例崩溃

redhawk module service function usage example crashes

所以我正在构建一个 redhawk 模块并尝试将数据作为测试传递给它。在将他们关于如何使用输入和输出端口的示例放入 serviceFunction() 之后,我能够毫无错误地构建模块(我更改了变量名称以匹配我的端口)。当我将模块放在白板上并 link 时,一切正常,但一旦我启动模块,它就会崩溃。我添加了一行以将传入的流 ID 写入控制台,这将在崩溃前击中控制台 10 到 20 次(它正确地写入提供信号的信号发生器的 ID)。如果我绘制输出端口,则在崩溃之前不会绘制任何内容(当我说崩溃时,我的意思是模块刚刚从白板上消失,ide 仍然存在并且 运行)。

服务函数为:

int freqModFrTest_i::serviceFunction()
{

    bulkio::InFloatPort::dataTransfer *tmp = dataFloatIn->getPacket(bulkio::Const::BLOCKING);
    if (not tmp) { // No data is available
        return NOOP;
    }
    else
    {
        std::cout<<tmp->streamID<<std::endl;
        std::vector<float> outputData;
        outputData.resize(tmp->dataBuffer.size());
        for (unsigned int i=0; i<tmp->dataBuffer.size(); i++) {
            outputData[i] = (float)tmp->dataBuffer[i];
        }

        // NOTE: You must make at least one valid pushSRI call
        if (tmp->sriChanged) {
            ComplexOut->pushSRI(tmp->SRI);
        }
        ComplexOut->pushPacket(outputData, tmp->T, tmp->EOS, tmp->streamID);

        delete tmp; // IMPORTANT: MUST RELEASE THE RECEIVED DATA BLOCK
        return NORMAL;
    }
}

有没有人有类似的问题或任何ide关于什么会导致这种情况?

附加信息:

根据 pwolfram 的建议,我构建了一个 sig 发生器,并将此组件转换为波形。从域启动它时出现错误:

2016-01-14 07:41:50,430 ERROR DCE:aa1a189e-0b5b-4968-9150-5fc3d501dadc{1}:1030 - 
Child process 3772 terminated with signal 11

尝试重新启动组件时(因为它只是停止而不是消失)我收到以下错误:

Error while executing callable. Caused by org.omg.CORBA.TRANSIENT:
Retries exceeded, couldn't reconnect to 10.62.7.21:56857
Retries exceeded, couldn't reconnect to 10.62.7.21:56857

在 REDHAWK 2.0.0 中,我创建了一个具有相同名称 (freqModFrTest) 和端口名称(dataFloatIn 和 ComplexOut)的组件,并逐字使用了您的服务函数。但是我没有遇到任何问题。

这里有一些尝试:

  • 清理并重建组件。沙盒(您称之为白板)将 运行 已构建的二进制文件。您可能已经修改了代码并且磁盘上有旧版本的二进制文件。右键单击该项目并 select "clean project"。然后右键单击 select "Build Project" 这将确保二进制文件与您的源代码匹配。

  • 运行 组件处于调试模式。如果双击 SPD 文件,在 "overview" 选项卡下有 "Debug a component in the sandbox"。这将在调试上下文中启动黑板中的组件。您可以设置断点并逐行遍历代码。如果您没有设置断点,尽管 IDE 将在发生致命错误时停止执行。如果出现问题(如无效的内存访问),IDE 将提示您进入调试模式,它应该指出问题所在的代码行。

  • 如果这些选项失败,您可以启用核心转储并使用 GDB 查看代码中出现问题的位置。网上有很多 GDB 教程,但要点是在启动 IDE 之前,您需要键入 "ulimit -c unlimited",然后从同一终端启动 IDE。现在当你的组件死掉时,它会产生一个核心文件。

希望其中之一能让您走上正确的道路。