linux下程序启动即推出的原因定位分析过程

现象:

  1. 安装 todesk 的 deb包并配置 daemon 后,todesk无法运行.
  2. 查看 程序 status 提示:
  3. Process: 168846 ExecStart=/opt/todesk/bin/ToDesk_Service (code=killed, signal=ILL)

结论:

引发当前 todesk 启动即退出的原因是当前 CPU指令集不受软件功能函数调用支持。

同样有此困扰的软件 还有 MongoBD MySQL ,原因都是较新的软件版本函数特性与较旧的 CPU指令集不详匹配。

分析过程:

root@Debian-H81:~#
root@Debian-H81:~# todesk
root@Debian-H81:~#
root@Debian-H81:~# systemctl status todeskd.service
● todeskd.service - ToDesk Daemon Service
Loaded: loaded (/etc/systemd/system/todeskd.service; enabled; preset: enabled)
Active: activating (auto-restart) (Result: signal) since Sun 2024-02-25 09:31:48 CST; 2s ago
Process: 168763 ExecStart=/opt/todesk/bin/ToDesk_Service (code=killed, signal=ILL)
Main PID: 168763 (code=killed, signal=ILL)
CPU: 28ms
root@Debian-H81:~#
root@Debian-H81:~# systemctl start todeskd.service
root@Debian-H81:~#
root@Debian-H81:~# systemctl status todeskd.service
● todeskd.service - ToDesk Daemon Service
Loaded: loaded (/etc/systemd/system/todeskd.service; enabled; preset: enabled)
Active: activating (auto-restart) (Result: signal) since Sun 2024-02-25 09:32:11 CST; 459ms ago
Process: 168846 ExecStart=/opt/todesk/bin/ToDesk_Service (code=killed, signal=ILL)
Main PID: 168846 (code=killed, signal=ILL)
CPU: 23ms
root@Debian-H81:~#
root@Debian-H81:~#

分析过程:
先查看 todesk的日志,发现日至文件大小为0(即文件内容为空)

root@Debian-H81:~#
root@Debian-H81:~# ls -Fl /var/log/todesk/
total 0
-rw-r--r-- 1 root root 0 Feb 24 20:10 sdkservice_2024_02_24.log
-rw-r--r-- 1 root root 0 Feb 25 00:00 sdkservice_2024_02_25.log
-rw-r--r-- 1 root root 0 Feb 24 20:10 service_2024_02_24.log
-rw-r--r-- 1 root root 0 Feb 25 00:00 service_2024_02_25.log
-rw-r--r-- 1 root root 0 Feb 24 20:10 zrtcservice_2024_02_24.log
-rw-r--r-- 1 root root 0 Feb 25 00:00 zrtcservice_2024_02_25.log
root@Debian-H81:~#

再查看OS的系统日志,sys-log 打印如下

root@Debian-H81:~#
root@Debian-H81:~# dmesg -T | grep -i "todesk" | tail -n 20
[Sun Feb 25 09:37:27 2024] traps: ToDesk_Service[169950] trap invalid opcode ip:4d06da sp:7fff8f513f20 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:37:31 2024] traps: ToDesk_Service[169961] trap invalid opcode ip:4d06da sp:7ffe83d255a0 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:37:34 2024] traps: ToDesk_Service[169974] trap invalid opcode ip:4d06da sp:7ffe8d386380 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:37:37 2024] traps: ToDesk_Service[169985] trap invalid opcode ip:4d06da sp:7ffdea6e0780 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:37:40 2024] traps: ToDesk_Service[169996] trap invalid opcode ip:4d06da sp:7ffd9eadb140 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:37:44 2024] traps: ToDesk_Service[170007] trap invalid opcode ip:4d06da sp:7ffcf65ea380 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:37:47 2024] traps: ToDesk_Service[170018] trap invalid opcode ip:4d06da sp:7fffabdb8700 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:37:50 2024] traps: ToDesk_Service[170029] trap invalid opcode ip:4d06da sp:7ffd4ba89180 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:37:53 2024] traps: ToDesk_Service[170042] trap invalid opcode ip:4d06da sp:7fff5ef6ea00 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:37:57 2024] traps: ToDesk_Service[170053] trap invalid opcode ip:4d06da sp:7ffeb02b4000 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:38:00 2024] traps: ToDesk_Service[170064] trap invalid opcode ip:4d06da sp:7fffe46610a0 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:38:03 2024] traps: ToDesk_Service[170075] trap invalid opcode ip:4d06da sp:7fff2ec8da80 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:38:06 2024] traps: ToDesk_Service[170086] trap invalid opcode ip:4d06da sp:7fff337ba8a0 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:38:10 2024] traps: ToDesk_Service[170097] trap invalid opcode ip:4d06da sp:7ffce5d91560 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:38:13 2024] traps: ToDesk_Service[170110] trap invalid opcode ip:4d06da sp:7fff21955b80 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:38:16 2024] traps: ToDesk_Service[170121] trap invalid opcode ip:4d06da sp:7ffd8449b880 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:38:19 2024] traps: ToDesk_Service[170132] trap invalid opcode ip:4d06da sp:7ffe8c3f7540 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:38:23 2024] traps: ToDesk_Service[170145] trap invalid opcode ip:4d06da sp:7ffcec227100 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:38:26 2024] traps: ToDesk_Service[170156] trap invalid opcode ip:4d06da sp:7fff210b6d40 error:0 in ToDesk_Service[400000+140f000]
[Sun Feb 25 09:38:29 2024] traps: ToDesk_Service[170167] trap invalid opcode ip:4d06da sp:7fff36d02b20 error:0 in ToDesk_Service[400000+140f000]
root@Debian-H81:~#

相关内容输出条目都是 trap 打印了 不可用的操作代码,怀疑这是 linux-kernel 打印出来的内容。

再次查看 system 级别的日志:

root@Debian-H81:~#
root@Debian-H81:~# journalctl --system | grep -i "todesk" | tail -n 20
Feb 25 09:41:03 Debian-H81 systemd[1]: todeskd.service: Failed with result 'signal'.
Feb 25 09:41:03 Debian-H81 kernel: traps: ToDesk_Service[170702] trap invalid opcode ip:4d06da sp:7ffe59e10620 error:0 in ToDesk_Service[400000+140f000]
Feb 25 09:41:06 Debian-H81 systemd[1]: todeskd.service: Scheduled restart job, restart counter is at 13365.
Feb 25 09:41:06 Debian-H81 systemd[1]: Stopped todeskd.service - ToDesk Daemon Service.
Feb 25 09:41:06 Debian-H81 systemd[1]: Started todeskd.service - ToDesk Daemon Service.
Feb 25 09:41:08 Debian-H81 systemd[1]: todeskd.service: Main process exited, code=killed, status=4/ILL
Feb 25 09:41:08 Debian-H81 systemd[1]: todeskd.service: Failed with result 'signal'.
Feb 25 09:41:08 Debian-H81 kernel: traps: ToDesk_Service[170713] trap invalid opcode ip:4d06da sp:7ffd651d0760 error:0 in ToDesk_Service[400000+140f000]
Feb 25 09:41:12 Debian-H81 systemd[1]: todeskd.service: Scheduled restart job, restart counter is at 13366.
Feb 25 09:41:12 Debian-H81 systemd[1]: Stopped todeskd.service - ToDesk Daemon Service.
Feb 25 09:41:12 Debian-H81 systemd[1]: Started todeskd.service - ToDesk Daemon Service.
Feb 25 09:41:13 Debian-H81 systemd[1]: todeskd.service: Main process exited, code=killed, status=4/ILL
Feb 25 09:41:13 Debian-H81 systemd[1]: todeskd.service: Failed with result 'signal'.
Feb 25 09:41:13 Debian-H81 kernel: traps: ToDesk_Service[170726] trap invalid opcode ip:4d06da sp:7ffe931fece0 error:0 in ToDesk_Service[400000+140f000]
Feb 25 09:41:16 Debian-H81 systemd[1]: todeskd.service: Scheduled restart job, restart counter is at 13367.
Feb 25 09:41:16 Debian-H81 systemd[1]: Stopped todeskd.service - ToDesk Daemon Service.
Feb 25 09:41:16 Debian-H81 systemd[1]: Started todeskd.service - ToDesk Daemon Service.
Feb 25 09:41:16 Debian-H81 systemd[1]: todeskd.service: Main process exited, code=killed, status=4/ILL
Feb 25 09:41:16 Debian-H81 systemd[1]: todeskd.service: Failed with result 'signal'.
Feb 25 09:41:16 Debian-H81 kernel: traps: ToDesk_Service[170737] trap invalid opcode ip:4d06da sp:7fff94b542a0 error:0 in ToDesk_Service[400000+140f000]
root@Debian-H81:~#

从日志输出上看,这的确是kernel报告的情况,需要到 linux kernel 的 对应模块中区查找对应的 日志内容含义。

当前要做的就是确定自己的 OS上使用了那个版本的 linux - kernel :

root@Debian-H81:~#
root@Debian-H81:~# hostnamectl status
Static hostname: Debian-H81
Icon name: computer-desktop
Chassis: desktop ️
Machine ID: 025c1b94eb45483b85ca811168c89854
Boot ID: 978473a80fc746638881c8fdfb9f63b9
Operating System: Debian GNU/Linux 12 (bookworm)
Kernel: Linux 6.1.0-18-amd64
Architecture: x86-64
Hardware Vendor: BIOSTAR Group
Hardware Model: H81MLV3
Firmware Version: 4.6.5
root@Debian-H81:~#

我当前的 Debian 12 上使用的 kernel 版本 是 : Linux 6.1.0-18-amd64

来到 kernel 站点 下载对应的 kernel 程序包,并确认程序报中的 trap 模块所在

通过在 Debian 站点上搜索 kernel 信息,可知 它对应了 Linus Tovals 的 linux-6.1.76

Package linux-headers-6.1.0-18-amd64

  • bookworm (stable) (kernel): Header files for Linux 6.1.0-18-amd64
    6.1.76-1: amd64

    Package linux-image-6.1.0-18-amd64

  • bookworm (stable) (kernel): Linux 6.1 for 64-bit PCs (signed)
    6.1.76-1: amd64

对应版本的kernel下载连接:

 
  1. https://www.kernel.org/
  2. https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.1.76.tar.gz

查看源文件中的 traps.c

debian@Debian-H81:~/Downloads$
debian@Debian-H81:~/Downloads$ cat -n /home/debian/Downloads/linux-6.1.76/arch/x86/kernel/traps.c | grep -i "invalid opcode"
297 do_error_trap(regs, 0, "invalid opcode", X86_TRAP_UD, SIGILL,
debian@Debian-H81:~/Downloads$
debian@Debian-H81:~/Downloads$ cat -n /home/debian/Downloads/linux-6.1.76/arch/x86/kernel/traps.c | grep -C 30 -i "invalid opcode"
267 UNWIND_HINT_FUNC
268 ANNOTATE_NOENDBR
269 " nop\\n\\t"
270
271 : "=a" (ret) : : "memory");
272
273 return !ret;
274 }
275
276 static int __init ibt_setup(char *str)
277 {
278 if (!strcmp(str, "off"))
279 setup_clear_cpu_cap(X86_FEATURE_IBT);
280
281 if (!strcmp(str, "warn"))
282 ibt_fatal = false;
283
284 return 1;
285 }
286
287 __setup("ibt=", ibt_setup);
288
289 #endif / CONFIG_X86_KERNEL_IBT /
290
291 #ifdef CONFIG_X86_F00F_BUG
292 void handle_invalid_op(struct pt_regs *regs)
293 #else
294 static inline void handle_invalid_op(struct pt_regs *regs)
295 #endif
296 {
297 do_error_trap(regs, 0, "invalid opcode", X86_TRAP_UD, SIGILL,
298 ILL_ILLOPN, error_get_trap_addr(regs));
299 }
300
301 static noinstr bool handle_bug(struct pt_regs *regs)
302 {
303 bool handled = false;
304
305 /*
306 * Normally @regs are unpoisoned by irqentry_enter(), but handle_bug()
307 * is a rare case that uses @regs without passing them to
308 * irqentry_enter().
309 */
310 kmsan_unpoison_entry_regs(regs);
311 if (!is_valid_bugaddr(regs->ip))
312 return handled;
313
314 /*
315 * All lies, just get the WARN/BUG out.
316 */
317 instrumentation_begin();
318 /*
319 * Since we're emulating a CALL with exceptions, restore the interrupt
320 * state to what it was at the exception site.
321 */
322 if (regs->flags & X86_EFLAGS_IF)
323 raw_local_irq_enable();
324 if (report_bug(regs->ip, regs) == BUG_TRAP_TYPE_WARN ||
325 handle_cfi_failure(regs) == BUG_TRAP_TYPE_WARN) {
326 regs->ip += LEN_UD2;
327 handled = true;
debian@Debian-H81:~/Downloads$

从第287行到300行的内容看,导致 todesk 启动即退出(Feb 25 10:26:00 Debian-H81 kernel: traps: ToDesk_Service[180347] trap invalid opcode ip:4d06da sp:7ffea5ceb1c0 error:0 in ToDesk_Service[400000+140f000 )的 原因 应该是 KERNEL_IBT 无法处理传入到CPU寄存器的运算数引发的CPU诱骗关口报错。

那么 KERNEL_IBT 是用来干什么的呢?
IBT, 全称为 “indirect branch tracking“,是 Control-flow integrity 思想的一种具体实现,用于防御面向跳转编程 的控制流,确保每个 indirect branch 的目标确实都是适合作为跳转目标的。英特尔处理器的 IBT 功能得到了硬件的支持,如果 IBT 被启用,那么 CPU 将确保每个间接跳转都落在一条特殊指令(endbr32 或 endbr64)上,该指令执行时跟 no-op 效果一致。如果发生意外,那么处理器将引发一次 control-protection(#CP)exception。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

873. 最长的斐波那契子序列的长度【leetcode】/动态规划

873. 最长的斐波那契子序列的长度 如果序列 X_1, X_2, …, X_n 满足下列条件&#xff0c;就说它是 斐波那契式 的&#xff1a; n > 3对于所有 i 2 < n&#xff0c;都有 X_i X_{i1} X_{i2} 给定一个严格递增的正整数数组形成序列 arr &#xff0c;找到 arr 中最长的…

大模型通用基础知识解析

大模型的训练和微调 大模型的训练分两个阶段&#xff1a;预训练(Pretrained)和微调(Fine tuning)。因此大模型训练和微调不完全是一个意思&#xff0c;训练包含了微调。 模型预训练&#xff1a;通过在大量无标注数据上进行训练&#xff0c;从而学习到语言的一般规律和知识&am…

代码训练营第52天|● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;代码随想录的个人空间-代码随想录个人主页-哔哩哔哩视频 (bilibili.com) LeetCode 300.最长递增子序列 题目链接&#xff1a;300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 解题代码…

蓝桥杯练习系统(算法训练)ALGO-992 士兵杀敌(二)

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 南将军手下有N个士兵&#xff0c;分别编号1到N&#xff0c;这些士兵的杀敌数都是已知的。   小工是南将军手下的军师&…

数据中心在高性能计算(HPC)中的作用

高性能计算&#xff08;HPC&#xff09;已成为解决复杂问题、推动科学研究、人工智能和其他各种应用领域的关键工具。要确保高性能计算系统的高效运行&#xff0c;需要专门的基础设施和支持。数据中心在满足高密度计算、管理散热和提供强大带宽方面起着关键作用。本文探讨了数据…

langchain学习笔记(十一)

关于langchain中的memory&#xff0c;即对话历史&#xff08;message history&#xff09; 1、 Add message history (memory) | &#x1f99c;️&#x1f517; Langchain RunnableWithMessageHistory&#xff0c;可用于任何的chain中添加对话历史&#xff0c;将以下之一作为…

串的定义及BF算法

定义 BF算法——朴素查找算法——也叫做串的模式匹配算法 其应用特别多&#xff0c;比如经常在一篇文章里面搜索一些东西&#xff0c;&#xff08;比如文章里的某个内容&#xff0c;或某些关键字词出现的位置&#xff0c;次数等&#xff09; 之前我们大多数情况下是用来搜索关…

基于Springboot的助农管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的助农管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

【项目实践】如何解决并发场景下数据一致性问题

1.背景 并发写场景下&#xff0c;由于微服务的系统环境复杂&#xff0c;不可避免的会出现 【机器、缓存、数据库、依赖服务】等出现问题&#xff0c;导致数据不一致的情况产生。 影响大且广&#xff1a; 1、数据不一致问题在线上可能会产生故障 2、数据不一致会导致长尾错误…

IP传输方式——组播

组播作为IP传输三种方式之一&#xff0c;指的是报文从一个源发出&#xff0c;被转发到一组特定的接收者&#xff0c;相同的报文在每条链路上最多有一份。相较于传统的单播和广播&#xff0c;组播可以有效地节约网络带宽、降低网络负载&#xff0c;所以被广泛应用于IPTV、实时数…

项目中如何优雅的使用枚举类型

原文链接&#xff1a;赵侠客 前言 枚举类型在开发中是很常见的&#xff0c;有非常多的应用场景&#xff0c;如状态管理、类型分类、权限控制、配置管理、错误码管理、日志级别等。正确合理的使用枚举可以给我们带来非常多的好处&#xff1a; 增强代码可读性&#xff1a;枚举可…

pandas.DataFrame新增列、dropna()方法-丢弃含空值的行、列;inf的处理技巧

在Dataframe中新添加一列 直接指明列名&#xff0c;然后赋值就可 import pandas as pddata pd.DataFrame(columns[a,b], data[[1,2],[3,4]]) data >>> dataa b 0 1 2 1 3 4 添加一列’c‘&#xff0c;赋值为空白值。打印出来 data[c] data >>>…

1255942-05-2,DBCO-C6-Amine,可以用于构建分子结构和生物活性分子

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;1255942-05-2&#xff0c;DBCO C6 NH2&#xff0c;DBCO-C6-Amine&#xff0c;二苯并环辛炔-C6-氨基 一、基本信息 【产品简介】&#xff1a;DBCO-C6-NH2 is a multifunctional molecule with excellent chemical re…

【王道操作系统】ch1计算机系统概述-05操作系统引导

文章目录 【王道操作系统】ch1计算机系统概述-05操作系统引导01 什么是操作系统引导02 磁盘里边有哪些相关数据&#xff08;1&#xff09;主引导记录&#xff08;MBR&#xff09;&#xff08;2&#xff09;活动分区&#xff08;一般是C盘&#xff09; 03 操作系统引导的过程 【…

教你如何系统的学习Python

明确学习目标&#xff1a; 明确学习Python的目的&#xff0c;是数据分析、网页开发、机器学习还是其他领域。明确目标有助于选择合适的学习路径和资源。 学习基础语法&#xff1a; 学习Python的基本语法&#xff0c;包括变量、数据类型、控制流程&#xff08;if语句、循环等&a…

如何创建MinIO存储服务公网地址实现固定TCP域名异地远程访问——“cpolar内网穿透”

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统&#xff0c;它可以100%的运行在标准硬件上&#xff0c;即X86等…

每日一题 — 盛水最多的容器

11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 因为体积是长度乘高&#xff0c;所以运用双指针&#xff0c;一个在最左&#xff0c;一个在最右&#xff0c;每次都记录体积 V &#xff0c;然后比较左边的长度和右边的长度&#xff0c;左边的长度…

题解:CF1927C

链接&#xff1a;CF 把 1 1 1 ~ k k k 分为 4 4 4 类&#xff1a;两个里面都有的&#xff08;1&#xff09;、只在a里面的&#xff08;2&#xff09;、只在b里面的&#xff08;3&#xff09;、a和b里都没有的&#xff08;4&#xff09; 如果有&#xff08;4&#xff09;&a…

【代码随想录算法训练营Day35】435.无重叠区间;763.划分字母区间;56.合并区间

文章目录 ❇️Day 36 第八章 贪心算法 part05✴️今日任务❇️435. 无重叠区间自己的思路自己的代码&#xff08;✅通过81.59%&#xff09;随想录思路随想录代码 ❇️763.划分字母区间自己的思路自己的代码&#xff08;✅通过55.30%&#xff09;随想录思路随想录代码 ❇️56. 合…

长/短 链接/轮询 和websocket

短连接和长连接 短连接&#xff1a; http协议底层基于socket的tcp协议&#xff0c;每次通信都会新建一个TCP连接&#xff0c;即每次请求和响应过程都经历”三次握手-四次挥手“优点&#xff1a;方便管理缺点&#xff1a;频繁的建立和销毁连接占用资源 长连接&#xff1a; 客…