程序中的所有指针变量在突然崩溃后都被删除了吗

Do all the pointer variables inside a program got deleted after sudden crash?

本文关键字:崩溃 删除 突然 变量 指针 程序      更新时间:2023-10-16

我有一个基于IP的摄像头(basler Ace2000-50gm),连接到运行ubuntu 12.04 64位的嵌入式板上。我设法根据它的文档配置了它,现在我可以用我喜欢的任何参数以任何帧速率获取帧。(我使用了C++API)

这是初始化代码:

typedef Pylon::CBaslerGigEInstantCamera Camera_t;
void Cam_Init()
{
    bool Camera_Initialization = false;
    Camera_t *Camera;
    Camera = new Camera_t();
    PylonInitialize();
    do{
        if(!Camera_Initialization)
        {
            try
            {
                CTlFactory& tlFactory = CTlFactory::GetInstance();
                // Get all attached devices and exit application if no device is found.
                DeviceInfoList_t devices;
                qDebug("Detecting Camera ....");
                if ( tlFactory.EnumerateDevices(devices) == 0 )
                {
                    throw RUNTIME_EXCEPTION( "No camera present.");
                }
                Camera  = new Camera_t(  tlFactory.CreateDevice( devices[0 ]) );
                Camera->Open();
                CAcquireContinuousConfiguration().OnOpened( *Camera);
                Camera->StartGrabbing( GrabStrategy_UpcomingImage);
                Camera_Initialization = true;
                qDebug("Camera is Configured Successfully");
            }
            catch( GenericException &e )
            {
                Interface<<  "****  An exception occurred! Desription is: " << "n"<< "    " << e.GetDescription() << "n";
            }
        }
    }while(!Camera_Initialization);
}

此代码是大型程序的一部分。

问题是我的程序突然崩溃(我还没有找到它的源代码),当我重新运行代码时,它直到上次崩溃后5分钟或更长时间才检测到相机!!!它给出以下错误信息

****  An exception occurred! Desription is: 
    Failed to open 'Basler acA2000-50gm#00305316A684#10.136.18.100:3956'. The device is controlled by another application. Err: GX status 0xe1018006 (0xE1018006)

正如你所看到的我初始化相机的代码,我使用了一个指针对象来连接我的相机,我认为当代码崩溃时,这个指针不会被删除,所以相机不可用!

我也认为这是一种网络问题,我不知道如何解决它。当我的程序崩溃时,我尝试了各种不同的方法来重新启动Ubuntu中的网络服务,例如:

sudo service network-manager restart
sudo ifdown eth0 && sudo ifup eth0
. 
.
.

但它们都不适用于我,而且当我的程序崩溃时,运行我的程序需要5分钟以上。

令人惊讶的是,5分钟后,我的代码正确地检测到了相机,并且我能够运行我的代码。我尝试了无数次,我必须至少停留5分钟才能运行检测摄像头的代码!!!(在接下来的5分钟内,它重复显示上述错误消息)我在自己的笔记本电脑和PC上多次运行此代码,但在代码崩溃后,我可以毫无问题地运行代码,所以我认为问题出在嵌入式板网络上!

我以为每一种变量都会在终止程序后被删除,但这样想似乎有点错误!

我可以提供你想要解决这个问题的任何信息。感谢

内存被释放,但析构函数将不会运行。可能析构函数通知系统它不再是控制设备。

我认为这是系统中的一个错误。事实上一个特定的过程是控制设备应该表现得很好就像open一样,如果进程崩溃独立的(在Unix下,这可以通过将其实现为例如某种伪设备。)

C++标准(§18.3/8):"调用exit()不会破坏自动对象。"
"正常终止进程,为终止进程执行定期清理。"
其中,定期清理是对静态对象的销毁,而不是动态分配的对象。

为了解决这个问题,你可以试着摆弄信号处理程序,如果你有指向相机的指针,就在那里断开连接。

当你尝试的时候,我发现了内存泄漏!

Camera = new Camera_t();

       Camera  = new Camera_t(  tlFactory.CreateDevice( devices[0 ]) );

中间没有空闲。同样也没有相机的回报,所以我必须假设

            CAcquireContinuousConfiguration().OnOpened( *Camera);

不知怎的有Camera的地址,否则还有另一个泄漏。

信号处理程序

如果您有某种全局访问设备的方法,那么如果main中的try-catch不能,那么其中一个信号处理程序可能能够捕获您的错误。

此故障与C++或任何其他编程语言无关,也与操作系统无关。事实上,这是Basler Pylon API的意图。原因是,通信是通过UDP完成的。这是一个无连接的网络协议。为了知道对方仍然存在,Basler摄像头协议驱动程序(在您的网络接口中)将循环发送一些数据,也称为心跳消息。默认的心跳超时为3000ms,但在调试过程中会自动增加到5分钟。因此,大约需要5分钟,直到摄像机知道原始连接丢失,并允许进行另一个连接。

(来自Pylon.Net帮助)

使用GigE相机调试挂架应用程序

当使用GigE相机调试挂架应用程序时,您可能会遇到所谓的"心跳"超时。应用程序必须以定义的间隔向摄像机发送特殊的网络数据包。如果相机没有及时接收到这些心跳,它将认为连接已断开,并且不会接受来自应用程序的任何命令。

为了解决这个问题,您必须在开发过程中延长心跳超时时间。可以通过设置PYLON_GIGE_HEARTBEAT环境变量来执行此操作。这将指示挂架在打开相机时将心跳间隔更改为给定值。或者,您可以在代码中设置相机传输层的HeartbeatTimeout属性。

Copycamera.Parameters[PLTransportLayer.HeartbeatTimeout].TrySetValue(1000, IntegerValueCorrection.Nearest);  // 1000 ms timeout

当在调试器下运行时,挂架GigE传输层会自动将设备的心跳超时设置为5分钟。这可以通过设置PYLON_GIGE_HEARTBEAT环境变量来覆盖。我们建议不要依赖默认机制,而是通过如上所述设置适当的心跳超时来明确指定心跳超时。

注意
如果您将心跳超时设置为高值,并在未通过调用Close()方法正确关闭设备的情况下停止应用程序,则将无法再次打开相机。此外,您还会收到一个错误,说明设备当前正在使用中。如果使用调试器停止应用程序,则可能会发生这种情况。若要再次打开相机,必须等待超时,或者断开网络电缆与相机的连接