minhanghuang/CyberRT

在arm上使用cyberrt,debug版本工程可执行文件没问题,release版本的报错

sozzled-hust opened this issue · 23 comments

1686705003278
大佬你好,我的arm版的cyberrt是基于你这个工程,通过arm docker编译出来的动态链接库;
然后我的工程里面使用了cyebrrt,cmake参数DEBUG出来的可执行程序,在arm环境中能够正常使用(收发消息)。但是cmake 参数为release的时候,在arm环境中发送消息正常,当我打运行接收程序,就会报错(段错误)。我也尝试了,只启动接收程序(先不启动发送程序),是不会报错的,但是只要启动发送程序,就会报同样的错误。
不知道是什么原因导致的

1686705003278 大佬你好,我的arm版的cyberrt是基于你这个工程,通过arm docker编译出来的动态链接库; 然后我的工程里面使用了cyebrrt,cmake参数DEBUG出来的可执行程序,在arm环境中能够正常使用(收发消息)。但是cmake 参数为release的时候,在arm环境中发送消息正常,当我打运行接收程序,就会报错(段错误)。我也尝试了,只启动接收程序(先不启动发送程序),是不会报错的,但是只要启动发送程序,就会报同样的错误。 不知道是什么原因导致的

Hi @sozzled-hust, 我在本地的ARM环境编译release版本也出现同样的问题, 具体原因还没有找到, 一起探讨探讨!

@sozzled-hust 请教下大佬,你在docker里面编译的时候,遇见过protobuf版本不一致的问题吗,我这边一直报这个错

@sozzled-hust 请教下大佬,你在docker里面编译的时候,遇见过protobuf版本不一致的问题吗,我这边一直报这个错

hi @ycdhqzhiai 运行./scripts/install.sh后, 会安装指定的protobuf==v3.14.0, 使用这个protobuf来编译CyberRT是没问题的

@ycdhqzhiai 我在docker中编译,按照README.md安装,没有问题。你说的protobuf版本问题,我是在我自己的项目中,交叉编译的时候遇到过。就如作者所说,使用protobuf3.14.0就可以了。然后eigen好像是需要使用3.4.0版本(尽量都按照apollo8.0依赖的三方库版本来)。

@sozzled-hust @minhanghuang 感谢两位大佬回复,我这边docker里面有protobuf, protoc --version版本算3.6.1,然后按照readme里面安装时候,就报protobuf版本问题,我自己在third_party里面安装protobuf还是不行,为这种情况是不是需要先把docker里面自带的protobuf卸载啊

@ycdhqzhiai 我在X86下使用的时候遇到过你说的问题,可以直接安装./CyberRT/third_party/protobuf,但是我们其中有台电脑即使卸载了protobuf3.6然后安装protobuf3.14.0,还是报版本错误。最后重装系统才解决。

我把install.sh里面的checkout版本换成3.6.1 可以正常生成*.pb.h和*.cc,没有报版本错误,但是编译的时候,cyber里面报了很多class未定义,也不知道是不是由于protobuf的原因

Protobuf指定安装路径./CyberRT/install, 避免与本地环境的Protobuf冲突

@minhanghuang 大佬请问下,我这边编译的时候报error: 'SerializedPayload_t' has not been declared很多这种错误,我看了下主要是cyber/transport/rtps里面的rtps报错的,我想问下我这边是不是缺少什么依赖库没有安装啊,是按照readme里面步骤来的

@minhanghuang 大佬请问下,我这边编译的时候报error: 'SerializedPayload_t' has not been declared很多这种错误,我看了下主要是cyber/transport/rtps里面的rtps报错的,我想问下我这边是不是缺少什么依赖库没有安装啊,是按照readme里面步骤来的

@ycdhqzhiai 运行脚本./scripts/install.sh安装依赖库(确保依赖库安装成功), 然后加载环境source install/setup.zsh, 最后编译, 你的系统环境是什么?

我是arm docker,fast-rtps-1.5.0-1.prebuilt.aarch64.tar.gz这个库我已经手动下载并且copy到了install目录中,但是还是报这个错误

建议使用./scripts/install.sh安装依赖库包括fastdds, 或者手动编译源码也可以, 把补丁文件加上, 然后安装到install

@minhanghuang 我在我的demo程序CMakeLists.txt里面添加了这句
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS}")
SET(CMAKE_BUILD_TYPE Release) #生成release

编译出来的可执行文件是3M(debug出来的是9M,正常release应该是500kb)
然后使用readelf -S cyber_talker | grep debug 没有打印,判断这个可执行文件应该是release版的。
最后在arm环境中运行,收发正常。

@minhanghuang 我在我的demo程序CMakeLists.txt里面添加了这句 set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS}") SET(CMAKE_BUILD_TYPE Release) #生成release

编译出来的可执行文件是3M(debug出来的是9M,正常release应该是500kb) 然后使用readelf -S cyber_talker | grep debug 没有打印,判断这个可执行文件应该是release版的。 最后在arm环境中运行,收发正常。

你说的没错, 但是set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS}")这个设置会把代码里的Assert打开

@minhanghuang
我使用set(CMAKE_CXX_FLAGS_RELEASE "-Og")这个参数,最后release出来的大小是700kb左右,已经非常接近不加参数的release版本(500kb左右)。
另外Assert是不是会影响程序执行效率?

@minhanghuang 我使用set(CMAKE_CXX_FLAGS_RELEASE "-Og")这个参数,最后release出来的大小是700kb左右,已经非常接近不加参数的release版本(500kb左右)。 另外Assert是不是会影响程序执行效率?

我认为Assert不会影响效率, 默认情况下Release会把所有的Assert代码删除, 如果代码中把业务逻辑放到Assert中做判断, Release版本可能会出问题

@sozzled-hust @minhanghuang 请问下,我debug报了以下同样的错位,也跟@sozzled-hust 尝试一样操作,gdb报错也是一样的,只启动接收程序(先不启动发送程序),是不会报错的,但是只要启动发送程序,就会报同样的错误。你们debug没有报错吗

1686705003278 大佬你好,我的arm版的cyberrt是基于你这个工程,通过arm docker编译出来的动态链接库; 然后我的工程里面使用了cyebrrt,cmake参数DEBUG出来的可执行程序,在arm环境中能够正常使用(收发消息)。但是cmake 参数为release的时候,在arm环境中发送消息正常,当我打运行接收程序,就会报错(段错误)。我也尝试了,只启动接收程序(先不启动发送程序),是不会报错的,但是只要启动发送程序,就会报同样的错误。 不知道是什么原因导致的

请问这个问题解决了吗?

请问这个问题解决了吗?

cyberrt编译好了之后,在自己的工程CMakeLists.txt里面添加release参数set(CMAKE_CXX_FLAGS_RELEASE "-Og"),编出来的是release版本的可执行程序,比-O3要大一点点。(x86上release没问题,主要是交叉编译arm工程里面release有问题)

好的非常感谢 正好我们也遇到同样的问题了,不过不知道有没有什么正向的解决方案,想了解一下。从代码分析来看,有点像是协程调度那部分用汇编写的代码有什么问题

好的非常感谢 正好我们也遇到同样的问题了,不过不知道有没有什么正向的解决方案,想了解一下。从代码分析来看,有点像是协程调度那部分用汇编写的代码有什么问题

戳到我知识盲区了,上面的临时解决办法我也是一个一个试出来的,差点都放弃了(debug版本在arm上跑规控算法,效率不能满足开发需求)。不知道9.0有没有类似的问题。

我就是更新到了9.0 依然有问题

我就是更新到了9.0 依然有问题