ROS1录包偶现一次崩溃问题定位

现象:崩到了mogo_reporter里面

堆栈:crash里面同时存在两个主线程的堆栈

代码

#include "boost/program_options.hpp"

#include <signal.h>

#include <string>

#include <sstream>

#include <iostream>

#include <thread>

#include <ros/ros.h>

#include "std_msgs/String.h"

#include "mogo_reporter/mogo_reporter.h"

#include "master.h"

#include "slave.h"

#include "configure.h"

namespace po = boost::program_options;

std::atomic<bool> gShutdown(false);

std::atomic<bool> gShouldRestart(true);

/**

 * Handle SIGTERM to allow the recorder to cleanup by requesting a shutdown.

 * \param signal

 */

void signal_handler(int signal)

{

  (void) signal;

  ros::requestShutdown();

  gShutdown.store(true);

  gShouldRestart.store(false);

}

int main(int argc, char** argv) {

    ros::init(argc, argv, "record_cache", ros::init_options::AnonymousName);

    MOGO_MSG_INIT_CFG("record_cache");

    gShouldRestart.store(false);

    setlocale(LC_ALL, "");

     

    signal(SIGTERM, signal_handler);

    signal(SIGINT, signal_handler);

    po::options_description desc("Allowed options");

    desc.add_options()

    ("help,h""produce help message")

    ("file,f",po::value<std::string>(),"config file path")

    ("create,c""create a record task")

    ("master""run as master")

    ("slave""run as slave");

    po::positional_options_description p;

    po::variables_map vm;

    try

    {

      po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);

    }

    catch (const boost::program_options::invalid_command_line_syntax &e)

    {

      ROS_ERROR("Error reading options: %s", e.what());

      return 1;

    }

    catch (const boost::program_options::unknown_option &e)

    {

      ROS_ERROR("Unknown options:%s", e.what());

      return 1;

    }

    if (vm.count("help"))

    {

      std::cout << desc << std::endl;

      exit(0);

    }

    if (vm.count("create"))

    {

    }

    if (vm.count("master"))

    {

    }

    if (vm.count("slave"))

    {

    }

    if (vm.count("file"))

    {

      record_cache::Configure::instance()->load(vm["file"].as<std::string>());

    }

    std::thread t([](){

      while(!gShutdown.load()) {

        if(!ros::master::check() && !gShouldRestart.load()) {

          ROS_WARN_STREAM("master offline, request shutdown!");

          ros::requestShutdown();

          gShouldRestart.store(true);

          break;

        }

        std::this_thread::sleep_for(std::chrono::milliseconds(200));

      }

    });

    t.detach();

    ros::NodeHandle node_handle("~");

    std::shared_ptr<record_cache::TaskManager> managerPtr;

    std::string hostname;

    char* str = getenv("ROS_HOSTNAME");

    if(!str) {

      hostname = "unknown";

    else {

      hostname = str;

    }

       

    ROS_DEBUG_STREAM("HOST:" << ros::master::getHost());

    std::string master = ros::master::getHost();

    if(hostname == master) {

      managerPtr = std::make_shared<record_cache::Master>();

    else {

      managerPtr = std::make_shared<record_cache::Slave>();

    }

       

    double pre_allocate_count_other;

    node_handle.param("pre_allocate_count_other", pre_allocate_count_other, static_cast<double>(1.5));

    managerPtr->setPreAllocateCountOther(pre_allocate_count_other);

    double pre_allocate_count_106;

    node_handle.param("pre_allocate_count_106", pre_allocate_count_106, static_cast<double>(2.5));

    managerPtr->setPreAllocateCount106(pre_allocate_count_106);

    int pre_allocate_pice_size = 0;

    node_handle.param("pre_allocate_pice_size", pre_allocate_pice_size, 100);

    managerPtr->setPreAllocatePiceSize(pre_allocate_pice_size);

    int trigger_mast_running_tasks_num = 3;

    node_handle.param("trigger_mast_running_tasks_num", trigger_mast_running_tasks_num, 3);

    managerPtr->setTriggerMastRunningTasksNum(trigger_mast_running_tasks_num);

    int trigger_mast_bduration = 10;

    node_handle.param("trigger_mast_bduration", trigger_mast_bduration, 10);

    managerPtr->setTriggerMastBduration(trigger_mast_bduration);

    int filter_record_interval = 5;

    node_handle.param("filter_record_interval", filter_record_interval, 5);

    managerPtr->setFilterRecordInterval(filter_record_interval);

    int single_msg_mast_size = 15;

    node_handle.param("single_msg_mast_size", single_msg_mast_size, 15);

    managerPtr->setSingleMsgMastSize(single_msg_mast_size);

    int bags_max_disk_space = 150;

    node_handle.param("bags_max_disk_space", bags_max_disk_space, 150);

    managerPtr->setbagsMaxDiskSpace(bags_max_disk_space);

     

    int record_time_split_size_gnss = 3600;

    node_handle.param("record_time_split_size_gnss", record_time_split_size_gnss, 3600);

    managerPtr->setRecordTimeSplitSizeGnss(record_time_split_size_gnss);

    int record_time_split_size_test = 1800;

    node_handle.param("record_time_split_size_test", record_time_split_size_test, 1800);

    managerPtr->setRecordTimeSplitSizeTest(record_time_split_size_test);

     

    // TODO 调整spin线程数量

    ros::AsyncSpinner s(0);

    s.start();

    managerPtr->start();

    ros::waitForShutdown();

     

    sleep(1);

    if(gShouldRestart.load()) {

      return 8;

    }

    return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1534432.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

[“1“, “2“, “3“].map(parseInt)结果

parseInt 的用法 parseInt 是 JavaScript 中的一个全局函数&#xff0c;用于将字符串转换为整数。它的基本语法如下&#xff1a; parseInt(string, radix);string&#xff1a;要解析的字符串。radix&#xff08;可选&#xff09;&#xff1a;字符串的基数&#xff0c;可以是 …

高科技企业选择跨网文件系统最容易踩坑的地方

在数字化时代&#xff0c;高科技企业频繁使用跨网文件交换系统的原因多种多样。首先&#xff0c;随着全球化的推进&#xff0c;企业需要在不同地理位置的分支机构之间传输敏感数据和重要文件。其次&#xff0c;跨网文件交换能够提高工作效率&#xff0c;确保信息的实时更新和共…

开源 TTS 模型「Fish Speech」1.4 发布;GameGen-O :生成开放世界游戏视频模型丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。 我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

高并发下的生存之道:如何巧妙化解热Key危机?

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 哈喽,大家好!我是小米,29岁,喜欢分享技术的小米上线啦!今天咱们来聊聊在互联网高并发场景下,一个让大家又爱又恨的问题——热Key问题。热Key是什么…

【C++】_stack和_queue容器适配器、_deque

当别人都在关注你飞的有多高的时候&#xff0c;只有父母在关心你飞的累不累。&#x1f493;&#x1f493;&#x1f493; 目录 ✨说在前面 &#x1f34b;知识点一&#xff1a;stack •&#x1f330;1.stack介绍 •&#x1f330;2.stack的基本操作 &#x1f34b;知识点二&…

【电路笔记】-反相运算放大器

反相运算放大器 文章目录 反相运算放大器1、概述2、理想反相运算放大器3、实际反相运算放大器3.1 闭环增益3.2 输入阻抗3.3 输出阻抗4、反相运算放大器示例5、总结1、概述 上一篇关于同相运算放大器的文章中已介绍了该运算放大器配置的所有细节,该配置在同相引脚 (+) 上获取输…

LSS如何创建视锥

1 完整代码 def create_frustum(self):# 128 352, 22 8in_H

LRELHLNNN;亲水性抗肝纤维化多肽作为基础肽;I型胶原蛋白靶向肽;九肽LRELHLNNN

【LRELHLNNN 简介】 LRELHLNNN是一种多肽&#xff0c;它能够选择性地结合到I型胶原蛋白&#xff0c;具有亲和力为170 nM。LRELHLNNN是由9个氨基酸组成&#xff0c;其氨基酸序列为H-Leu-Arg-Glu-Leu-His-Leu-Asn-Asn-Asn-OH。LRELHLNNN因其与I型胶原蛋白的高亲和力而在生物医学领…

MDC日志追踪(一)介绍

一、背景 在排查问题时&#xff0c;如果只根据关键字搜索&#xff0c;可能不精准&#xff0c;比如根据userId搜索&#xff0c;但是这个userId访问的记录也很多&#xff0c;很难定位出问题的是哪一次的&#xff1b;比如根据其他关键字搜索如orderId&#xff0c;可能很多用户都访…

wifi贴码推广能赚钱吗?wifi贴码怎么跟商家沟通?

大家好&#xff0c;我是鲸天科技千千&#xff0c;大家都知道我是做开发的&#xff0c;平时会给大家分享一些互联网相关的创业项目和网络技巧&#xff0c;感兴趣的可以给我点个关注。 最近WiFi这个项目很多朋友来问我&#xff0c;我是前两年就接触过这个&#xff0c;所以比较了…

“孪舟”引擎V5.0:更有颜、更真实、更智能、更灵活、更强大

在9月6日智汇云舟2024视频孪生产品发布会上&#xff0c;我们向线上线下嘉宾展示了基于视频孪生技术的众多产品&#xff0c;以及前沿技术。我们的目标是依托自研3DGIS引擎&#xff0c;将视频、AI、IoT等多种技术深度融合&#xff0c;升级数字孪生为视频孪生&#xff0c;实时实景…

《Putty 的下载和安装步骤》

Putty 是一款免费开源的 SSH 和 Telnet 客户端,它主要用于远程登录和管理其他计算机或服务器。 1.Putty 的一些主要特点和优势: 1. 简单易用:它具有直观的用户界面,操作相对简单,即使对于不太熟悉技术的用户也能轻松上手。 2. 支持多种协议:除了 SSH(Secure Shell)…

「漏洞复现」紫光电子档案管理系统 selectFileRemote SQL注入漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

亚马逊跨境新手小白如何选品?实操带练教程

选产品和找供应&#xff0c;是每个跨境人不可避免的&#xff0c;但是盲目的选品&#xff0c;无疑是大海捞针。最近我发现一个宝藏工具-店雷达&#xff0c;它可以帮助你选品的同时&#xff0c;同时还能为你筛选供应商。 我就分享一下我用店雷达的选品方法和思路&#xff0c;大家…

【TPAMI 2024】竟能如此丝滑的过渡,从2D生成对抗网络数据逐步学习3D重建网络!

题目&#xff1a;Progressive Learning of 3D Reconstruction Network From 2D GAN Data 从2D生成对抗网络数据逐步学习3D重建网络 作者&#xff1a;Aysegul Dundar; Jun Gao; Andrew Tao; Bryan Catanzaro ** 关注公众号&#xff1a;AI前沿速递&#xff0c;获取更多优质资源…

NV080D语音芯片赋能电子秤一体机人机交互新革新

随着科技的飞速发展&#xff0c;零售业正经历着前所未有的变革。九芯作为行业的领跑者&#xff0c;推出了革命性的NV080D语音芯片&#xff0c;为超市、水果店、熟食店、麻辣烫店等零售业态带来了智能化的全新体验。 NV080D语音芯片在电子秤上的应用&#xff0c;主要是为了提高检…

[ComfyUI]Flux:写真新篇章!字节PuLID率先开启一致性风格迁移,无损画手和优质画面保持

前言 Flux&#xff1a;PuLID率先开启F1写真新篇章 所有的AI设计工具&#xff0c;模型和插件&#xff0c;都已经整理好了&#xff0c;&#x1f447;获取~ Flux PuLID简介 在Flux出来后短时间内&#xff0c;社区生态反响和发展足够的迅猛快速。至今为止&#xff0c;社区LORA模…

c++面试-语法糖(一)

c面试-语法糖(一) 1、const关键字的作用&#xff1f;(变量&#xff0c;参数&#xff0c;返回值) 定义常量值&#xff1a;const 可以用于定义常量变量&#xff0c;其值在初始化后不能被修改。 const int MAX_SIZE 100;修饰指针&#xff1a;const 可以修饰指针&#xff0c;表示…

69、Python番外篇:从编程范式看如何学习一门编程语言的精髓

引言 在之前的文章中&#xff0c;我们曾聊过如何学习一门编程语言&#xff0c;当时是从程序的构成的角度来分析、展开的&#xff0c;主要提及了数据的表达 数据的处理&#xff0c;也就是数据结构 算法的内容。这个角度对应到所有编程语言&#xff0c;基本都是适用的。但是&a…

负载均衡:从理论到实践 ---day04

负载均衡 负载均衡1.什么是负载均衡2.负载均衡的分类硬件负载均衡软件负载均衡选择 3.引入负载均衡的好处 第一个Ribbon实例步骤1&#xff1a;步骤2&#xff1a;步骤3&#xff1a;步骤4&#xff1a; 问题1. 负载均衡的主要目标是什么&#xff1f;2. 负载均衡器的作用是什么&…