问题排查:C++ exception with description “getrandom“ thrown in the test body

在这里插入图片描述本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。

文章目录

  • Motivation
  • Process

Motivation

最近在做一个复杂系统集成到 Bazel 的工作。

在编译链接通过后为了能后确保外部系统的每个编译单元都没有动态链接的问题,需要多写一些测试代码,把这些代码都执行到。

在执行其中一个测试时,在众多的错误中报出了一个没有明确指向原因的错误:

unknown file: Failure
C++ exception with description “getrandom” thrown in the test body.

问题是代码中并没有直接调用到getrandom系统调用,其次也不知道为什么会报错。

Process

首先执行如下代码,开始gdb单元测试:

  1. bazel build --compilation_mode=dbg --test_timeout=60 xxxx/xxxxx/xxxxxx:test_xxx
  2. gdb xxxx/xxxxx/xxxxxx/test_xxx

从不多的错误信息可以看出时抛异常了,在GDB中执行如下指令拿到异常栈帧:

  1. catch throw
  2. r
  3. bt

请添加图片描述

这里可以看到原来是在boost库抛异常了,对应的boost库代码如下:

class random_provider_base
{
public://! Obtain entropy and place it into a memory location//! \param[in]  buf  the location to write entropy//! \param[in]  siz  the number of bytes to acquirevoid get_random_bytes(void *buf, std::size_t siz){std::size_t offset = 0;while (offset < siz){ssize_t sz = get_random(static_cast< char* >(buf) + offset, siz - offset, 0u);if (BOOST_UNLIKELY(sz < 0)){int err = errno;if (err == EINTR)continue;BOOST_THROW_EXCEPTION(entropy_error(err, "getrandom"));}offset += sz;}}private:static ssize_t get_random(void *buf, std::size_t size, unsigned int flags){
#if defined(BOOST_UUID_RANDOM_PROVIDER_GETRANDOM_IMPL_GETRANDOM)return BOOST_UUID_RANDOM_PROVIDER_GETRANDOM_IMPL_GETRANDOM(buf, size, flags);
#elif defined(BOOST_UUID_RANDOM_PROVIDER_GETRANDOM_HAS_LIBC_WRAPPER)return ::getrandom(buf, size, flags);
#elsereturn ::syscall(SYS_getrandom, buf, size, flags);
#endif}
};

我这个时候其实并不敏感。

从现有信息看已经基本确定是getrandom的问题了。

从[1]可以看到 getrandom 是在glibc 2.25 支持的

执行ldd --version发现我的glibc版本是2.28,原则上是支持的。

写个demo:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sys/random.h>
#include <unistd.h>int main() {size_t num_bytes = 16;unsigned char buffer[16];ssize_t result = getrandom(buffer, num_bytes, 0);if (result == -1) {perror("getrandom failed");std::cerr << errno << " :" <<  std::strerror(err) << std::endl;return EXIT_FAILURE;}printf("Random bytes: ");for (size_t i = 0; i < num_bytes; i++) {printf("%02x ", buffer[i]);}printf("\n");return EXIT_SUCCESS;
}

执行起来果然报错,输出为:
请添加图片描述

执行ldd a.out看看动态库依赖
请添加图片描述

此时怀疑glibc.so有问题,或者内核版本有问题

执行rpm -qf /lib64/libc.so.6 ,是RHEL的官方包,那基本有问题的概率不大。

请添加图片描述
执行nm libc.so.6 |c++filt|grep random

请添加图片描述
确实看到了glibcgetrandom符号,Text Section,且是有效的

执行strace -ff -o strace.log ./a.out,检查下可执行文件调用了哪些系统调用,确定是glibc的问题还是内核的问题。
在这里插入图片描述
原来原始的报错信息是Function not implemented,经过了几层异常后已经看不出来原始报错了,重新看了一遍文档getrandom系统调用3.17才支持,我的开发机只有3.10,是使用docker构造编译环境的。

docker只是经过Namespaces隔离,Cgroups隔离,Security隔离的特殊进程,和宿主机共享内核,自然系统调用就失败了。

所以确定就是内核版本问题。

参考:

  1. man getrandom

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

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

相关文章

C++中类的默认成员函数

默认成员函数 1.构造函数2.析构函数3.拷贝构造函数4.赋值运算符重载4.1运算符重载4.2赋值运算符重载 #mermaid-svg-oipiwg9stvONvYK0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-oipiwg9stvONvYK0 .error-icon{f…

从0开始学习机器学习--Day20--优化算法的思路

确定执行的优先级(Prioritizing what to work on : Spam classification example) 在建立学习系统前&#xff0c;我们不仅要梳理框架&#xff0c;更重要的是我们要弄清楚有哪些事情是要优先做的&#xff0c;这可以帮我们节约大量的时间。 以垃圾邮件为例&#xff0c;按照之前…

利用JS实现图片轮播(示例)

我们平时在逛购物网站的时候会看到页面内的商品图片自动轮播&#xff0c;二要想实现着中效果应该如何做呢&#xff1f;下面详细讲解代码的运用&#xff0c;实现下面视频的效果。大家也可以自己试试看&#xff0c;或者复制最后的完整代码运行一下&#xff01; 图片自动轮播效果 …

关于99.9% 达成读码率方案

1.标签样式 2.尺寸大小 长30mm*宽30mm 至 长40mm*宽40mm ; 3.位置 标签位置在箱体中间,可以误差5mm; 4.质量要求 ①无遮挡,标签不允许任何介质在上面,尤其是塑料片 ②平整,必须和箱子壁贴平,不允许翻边,飘荡。 ③码不能有模糊,手机摄像头扫码可以…

w~视觉~合集20~SAM

我自己的原文哦~ https://blog.51cto.com/whaosoft/12500982 #SAM 今天&#xff0c;Meta发布史上首个图像分割基础模型SAM&#xff0c;将NLP领域的prompt范式引进CV&#xff0c;让模型可以通过prompt一键抠图。网友直呼&#xff1a;CV不存在了! 就在刚刚&#xff0c;Meta AI…

三、直流有刷电机H桥驱动原理

1、H桥简介 H桥驱动电路&#xff1a;是一种用于控制直流电机正反转及速度的电路&#xff0c;其名称来源于其电路结构类似于字母“H”。H桥驱动电路由四个开关元件&#xff08;如晶体管、MOSFET等&#xff09;组成&#xff0c;这些开关元件被配置成可以控制电机两端电流的方向&…

Leetcode刷题

题目如下&#xff1a; 这道题呢&#xff0c;这里我写出了两种解决办法&#xff0c;一种遍历链表来得出中间结点&#xff0c;一种通过快慢指针来得出中间结点 第一种&#xff1a; 遍历&#xff1a; 首先我们设置一个计数器count&#xff0c;来记录链表的长度&#xff0c;写一…

游戏开发--C#面试题

游戏开发--C#面试题 C#1. 值类型和引用类型的区别2. 重载和重写的区别3. ArrayList和List的区别4. List底层是什么实现的&#xff1f;5. 抽象类和接口的区别6. 静态成员和⾮静态成员的区别7. 装箱和拆箱是指什么&#xff1f;8. 值和引用类型在变量赋值时的区别是什么&#xff1…

# 设置ubuntu为中文后,如何保留用户家目录等文件夹名为英文

设置ubuntu为中文后&#xff0c;如何保留用户家目录等文件夹名为英文 一、问题描述&#xff1a; 当我们安装完ubuntu系统后&#xff0c;通过【系统设置】&#xff0c;在【语言支持】里&#xff0c;设置为【汉语&#xff08;中国&#xff09;】&#xff0c;这时在终端中显示文…

STM32—独立看门狗(IWDG)和窗口看门狗(WWDG)

概述&#xff1a; WDG(Watchdog) 看门狗&#xff0c;看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能计时复位程序&#xff0c;避免程序陷入长时间的罢工状态&#xff0c;保证系…

Chrome与火狐哪个浏览器的性能表现更好

在数字时代&#xff0c;浏览器是我们日常生活中不可或缺的工具。无论是工作、学习还是娱乐&#xff0c;一个好的浏览器都能显著提高我们的效率和体验。市场上有许多优秀的浏览器&#xff0c;其中Google Chrome和Mozilla Firefox无疑是最受欢迎的两款。本文将比较这两款浏览器的…

现在国内优秀的广告联盟有哪些?

广告联盟是网络广告效果营销的主流方式之一&#xff0c;广告联盟的变现方式多种多样&#xff0c;主要有以下四种 CPA&#xff1a;按照下载或者注册进行付费&#xff08;软件平台或游戏试玩平台&#xff09;CPS&#xff1a;按照成交进行付费&#xff08;淘宝客&#xff09;CPM&…

机器学习,生成式AI ,LLM大模型,人工智能,他们之间的关系是什么?有什么不同?

这些概念都是现代计算机科学和人工智能领域的重要组成部分&#xff0c;它们之间既有联系&#xff0c;也有区别。以下是它们的关系和不同之处&#xff1a; 人工智能 (AI) 两个回答 人工智能是一个广义的概念&#xff0c;指的是计算机系统能够执行通常需要人类智能才能完成的任务…

[全网最细数据结构完整版]第七篇:3分钟带你吃透队列

目录 1->队列的概念及结构 2->队列的实现 2.1定义队列基本结构 struct QueueNode 和 struct Queue 2.2队列初始化函数 QueueInit 函数 2.3队列销毁函数 QueueDestroy 函数 2.4队列插入数据函数 QueuePush 函数 2.5判断队列是否为空,空返回true,非空返回false 2.6队列删…

点阵数显驱动IC数显LED驱动芯片VK1651

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK1651 封装形式&#xff1a;SOP16 产品年份&#xff1a;新年份 产品简介&#xff1a;VK1651是一种带键盘扫描电路接口的 LED 驱动控制专用芯片&#xff0c;内部集成有数据锁存器、LED 驱动、键盘扫描等电路。SEG脚…

【进阶】java基础之集合(2)数据结构<树>

文章目录 二叉树的内部结构二叉查找树平衡二叉树平衡二叉树的旋转机制 二叉树的内部结构 二叉查找树 二叉查找树&#xff0c;又称二叉排序树或者二叉搜索树 特点: 每一个节点上最多有两个子节点任意节点左子树上的值都小于当前节点任意节点右子树上的值都大于当前节点 二叉…

积分接口被刷爆,全体一个月降薪20%,这个项目我们遗漏了什么?

有一些往事总是会在酒后提起 我问朋友&#xff0c;在工作上有什么事情是到现在还记忆尤新的&#xff1f; 我朋友一个激灵坐起来&#xff0c;点上一支烟&#xff0c;只见烟头亮了4、5下&#xff0c;才见他吐出一口烟来&#xff0c;说道&#xff1a;“那还真有” 起因 刚参加…

AWTK-LINUX-FB实现多点触摸

两周前的一个地图&#xff0c;需要做手势缩放的功能&#xff0c;比较忙就没有发出来&#xff0c;这次抽时间记录一下实现的过程。 AWTK官方有对实现多点触摸做过描述&#xff0c;可惜只有STM32的实现例子&#xff0c;跟Linux的差别还是比较大的&#xff0c;好在tslib有多点触摸…

NRF52832学习笔记(41)——添加串口库libuarte

一、背景 由于板子上不支持硬件流控&#xff0c;在使用 app_uart_fifo 库接收串口大数据时&#xff0c;频繁报 APP_UART_COMMUNICATION_ERROR 错误&#xff0c;多次重新初始化后&#xff0c;串口也不再产生中断了。查看官方论坛后决定使用串口异步库 libuarte。 二、简介 Li…

ORU 的 Open RAN 管理平面 (M 平面)

[TOC](ORU 的 Open RAN 管理平面 (M 平面)) ORU 的 Open RAN 管理平面 (M 平面) https://www.techplayon.com/open-ran-management-plane-m-plane-for-open-radio-unit/ ORU M 平面 在 ORAN 中&#xff0c;设置参数的 O-RU 管理功能是通过 M-Plane 完成的。管理功能包括 O-…