2022年7月

openKylin 发布首个体验版,目标“每一行代码都自主创新”

一个月前,openKylin 社区宣布成立“中国首个桌面操作系统根社区”,其旨在在开源、自愿、平等、协作的基础上,通过开源、开放的社区合作,构建桌面操作系统顶级开源社区。但当时并未发布正式可用的操作系统软件。昨天,他们发布了 openKylin 的首个体验版:openKylin 0.7。它是基于 Linux 5.15 内核和其他开源组件进行构建,目标是“每一行代码都自主创新”。其默认搭载 UKUI 3.1 桌面环境,支持 Wayland,支持 PC、平板双模式。openKylin 社区计划每年发布一个操作系统版本,并不定期推送更新。

消息来源:openKylin
老王点评:在我看来,是不是首个桌面操作系统根社区根本不重要,是不是能做到“每一行代码都自主创新”也不重要,能发布一个广受好评的桌面操作系统才是最重要的。另外一点,这个 0.7 版本号颇具开源软件传统美德。

Apache OpenOffice 发布了一个微不足道的更新

Apache OpenOffice 于 2011 年创建后,几乎停滞不前。从 OpenOffice.org 分支出来的 LibreOffice 已经成为主导性的开源办公套件,而捐给 Apache 软件基金会的 Apache OpenOffice 只是时不时发布一些安全更新和错误修改。今天它发布了 v4.1.13 版本,可以看的出来,这是最早发布于 2014 年的 4.1 版的第 13 个错误修订版本,几乎没有什么值得一提的新特性。都 2022 年了,Apache OpenOffice 还运行在 Java 8 32 位的底层上。

消息来源:Phoronix
老王点评:我觉得 OpenOffice 都快成了 Apache 之耻了,何不放弃转而支持 LibreOffice 呢?难道自家的再破也是家当么?

英特尔提交了一行改进百倍的图形驱动补丁

开源的英特尔 Mesa Vulkan 驱动并入了一个光线追踪的重点修复,产生“近 100 倍(不是开玩笑)的改进”。更为重要的是,这只是一行代码带来的大幅改进。这是最初编写代码时的一个简单疏忽,但由于这一疏忽,意味着性能的巨大损失,还好它现在被发现了,而且是在英特尔 Arc 图形卡出现在大众面前之前。

消息来源:Phoronix
老王点评:所以,官方驱动有时候也挺拉胯的。

回音

  • 谷歌 解雇 了报告“AI 具备自我意识”的 工程师,该工程师认为谷歌的 “LaMDA 已经形成了自我意识,表达了对死亡的担忧,对保护的渴望,并确信它能感受到快乐和悲伤等情绪。”
  • 在月初 暂时撤回 之后,微软 Office 还是即将于本周迎来 一项更新,以阻止在下载的文档上启用 VBA 宏。

Discord 是一个跨平台的应用,可用于语音通话、视频通话、文本消息,以及分享媒体和文件。

它在游戏玩家和主播中非常流行。虽然,许多开源项目已经开始使用它来主持他们的社区讨论。你可以找到这类开源社区的 官方 Discord 服务器

Discord 可以直接从你的网页浏览器访问。安装官方桌面客户端可以让你获得系统通知和集中交流,而不是在多个打开的标签中摸索 Discord 标签。

虽然 Discord 为 Ubuntu 提供了 Deb 文件,但在 Arch Linux 上却没有这样的即用型软件包。

别担心。在本教程中,我将向你展示两种在 Arch Linux 及其衍生版本上安装 Discord 的方法。

  • 通过 Pacman 安装 Discord(命令行方法,对所有基于 Arch 的发行版有效)。
  • 通过 Pamac 安装 Discord(GUI 方法,对 Manjaro 和其他一些使用 Pamac 工具的基于 Arch 的发行版有效)。

方法 1: 通过 pacman 命令安装 Discord

首先,更新你的系统,因为它是一个滚动发布的版本,不支持部分升级

在终端输入以下 pacman 命令更新你的 Arch Linux 系统

sudo pacman -Syu

现在你可以通过以下命令安装 Discord 包。

sudo pacman -S discord

安装后,只需从应用菜单中启动应用,然后登录就可以开始使用 Discord。

Discord client in Arch Linux

如果你想安装 Discord 的每日构建版本 来测试即将到来的新功能,请使用以下命令。请注意,它可能并不稳定,所以如果你想要这个版本,请再考虑一下。

sudo pacman -S discord-canary

删除 Discord

如果你想删除 Discord,使用下面的命令来删除它以及它的依赖关系和配置文件:

sudo pacman -Rns discord

如果你选择的是每日构建版本,请使用以下命令将其删除:

sudo pacman -Rns discord-canary

这很不错。现在对于不喜欢使用终端的人来说,有一个替代方案。我将在下一节讨论这个问题。

方法 2:通过 Pamac 安装 Discord

如果你使用 Arch Linux 的衍生产品,如 Manjaro LinuxGaruda Linux 等,你就有一个叫做 Pamac 的图形化软件中心。

有了这个图形化的工具,你可以轻松地安装新的应用程序或删除现有的应用,而不必进入终端。

从应用程序菜单中启动 Pamac(添加/删除软件)。

pamac menu

点击“ 更新 Updates ”来更新你的系统。

pamac update

现在点击“ 浏览 Browse ”,使用左上方的搜索按钮搜索 “discord”。然后,选择软件包并点击“ 应用 Apply ”来安装。

Installing Discord from Pamac

你可以用 Pamac 来卸载软件包,就像你安装它一样。

我希望这个关于在基于 Arch 的 Linux 发行版上安装 Discord 的快速技巧对你有帮助。如果你有任何问题或建议,请告诉我。


via: https://itsfoss.com/install-discord-arch-manjaro/

作者:Anuj Sharma 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

使用开源的 PuTTY 工具,从 Windows 建立到 Linux 的 SSH 连接。

 title=

在 Linux 世界中, 安全外壳 secure shell (SSH)协议是最为常用的、通过命令行控制远程计算机的方式。SSH 是真正的 Linux 原创,但是它在 Windows 世界中也越来越流行。甚至有了一份官方的 Windows 的 SSH 文档,那篇文档阐述了使用 OpenSSH 控制 Windows 的方法。

这篇文章展示了如何使用了流行的开源工具 PuTTY,建立一个从 Windows 到 Fedora 33 Linux 系统的 SSH 连接。

使用 SSH 的方法

SSH 使用客户端-服务器模式,即 SSH 客户端会创建到 SSH 服务端的连接。SSH 服务器通常会作为 守护进程 Daemon 运行,所以它常被称为 SSHD。你很难找到一个不自带 SSH 守护进程的 Linux 发行版。在 Fedora 33 中,已安装了 SSH 守护进程,但是并未激活。

你可以使用 SSH 控制几乎所有的 Linux 机器,无论它是作为虚拟机还是作为网络上的物理设备运行。一个常见的用例是 无头 headless 配置的嵌入式设备,如树莓派。SSH 也可以用做一个其它网络服务的隧道。因为 SSH 连接是加密的,所以你可以使用 SSH 作为一个任何默认不提供加密的协议的传输层。

在这篇文章中,我将解释使用 SSH 的四个方式:1、如何在 Linux 端配置 SSH 守护进程;2、如何设置远程控制台连接;3、如何通过网络复制文件,4. 如何将 SSH 作为某些协议的隧道。

1、配置 SSHD

将 Linux 系统(文中是 Fedora 33)作为 SSH 服务器,允许 PuTTY SSH 客户端进行连接。首先,检查守护进程的 SSH 配置。配置文件放在 /etc/ssh/sshd_config,它包含了许多选项,通过取消掉相关行的注释就可以激活:

#       $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

Include /etc/ssh/sshd_config.d/*.conf

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

没有取消任何注释的默认配置在这个示例中应该是可以工作的。要检查 SSH 守护进程是否已经运行,输入 systemctl status sshd

$ systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-06-22 11:12:05 UTC; 2 years 11 months ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 577 (sshd)
    Tasks: 1 (limit: 26213)
   CGroup: /system.slice/sshd.service
           └─577 /usr/sbin/sshd -D -oCiphers=[[email protected]][5],chacha20-[...]

如果它处于 未激活 inactive 状态,使用 systemctl start sshd 命令启动它。

2、设置远程控制台

在 Windows 下 下载 PuTTY 安装程序,然后安装并打开它。你应看到一个像这样的窗口:

 title=

在“ 主机名(或 IP 地址) Host Name (or IP address) ”输入框,键入你的 Linux 系统的连接信息。本文设置了一个 Fedora 33 虚拟机,它使用桥接网络适配器,使我可以由 IP 地址 192.168.1.60 连接这个系统。点击“ 打开 Open ”,应会如图示的打开一个窗口:

 title=

这是 SSH 的安全措施之一,是为了防止 中间人攻击 man-in-the-middle attack 。消息中的指纹应该匹配 Linux 系统中放在 /etc/ssh/ssh_host_ed25519_key.pub 的密钥。PuTTY 将这个密钥以 MD5 哈希值 的方式打印出来。要检查它的真实性,切换到 Linux 系统并打开一个控制台,然后输入:

ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub

输出应该和 PuTTY 展示的指纹一致:

$ ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub
256 MD5:E4:5F:01:05:D0:F7:DC:A6:32 no comment (ED25519)

点击“ Yes ”以确认 PuTTY 的安全提示。主机系统的指纹现在存储在 PuTTY 的信任列表中,其位于 Windows 的注册表中的:

HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\SshHostKeys

输入正确的登录凭证,然后你应该进入控制台了,位置在你的用户主目录。

 title=

3、通过网络复制文件

除了远程控制台,你同样可以使用 PuTTY 通过 SSH 来传输文件。PuTTY 的安装目录在 C:\Program Files (x86)\PuTTY,在该目录下寻找 ppscp.exe。你既可以使用它从 Linux 系统复制文件,也可以复制文件到 Linux 系统。

使用 Windows + R 然后输入 cmd 来打开命令提示符,从你的 Linux 用户主目录复制 MYFile.txt 到你的 Windows 主目录,输入:

C:\"Program Files (x86)"\PuTTY\pscp.exe [email protected]:/home/stephan/MyFile.txt .

要从 Windows 主目录复制文件到 Linux 用户主目录,输入:

C:\"Program Files (x86)"\PuTTY\pscp.exe MyFile.txt [email protected]:/home/stephan/

就像你也许已经发现的那样,复制的命令通常构造为:

pscp.exe <source> <target>

4、隧道化一个协议

假设你拥有一个 Linux 机器,为某些特别的应用运行一个基于 HTTP 的服务。你想从你的 Windows 机器通过互联网访问这个 HTTP 服务。而且,你不能将相关的 TCP 端口暴露在公网,因为:

  1. 这个服务通过 HTTP 而非 HTTPS 运行
  2. 根本没有用户管理和登录系统

乍一看,建立这种架构不产生可怕的漏洞似乎是不可能的。但是 SSH 可简单的为这种情况建立一个安全的解决方案。

我将用我的软件项目 Pythonic 来演示这个过程。在容器中运行。Pythonic 作为容器运行,开放两个 TCP 端口:TCP 端口 7000(主要编辑器)和 TCP 端口 8000(code-server 代码编辑器)。

要在一个 Linux 机器上安装 Pythonic ,运行:

podman pull pythonicautomation/pythonic
podman run -d -p 7000:7000 -p 8000:8000 pythonic

转向你的 Windows 机器,打开 PuTTy,转到 “ 连接 Connection -> SSH -> 隧道 Tunnels ”。加入你要转发的两个 TCP 端口:

  • 源:7000 / 目标:localhost:7000
  • 源:8000 / 目标:localhost:8000

 title=

然后返回 “ 会话 Session ” 部分,并像之前那样建立一个 SSH 链接。打开网页浏览器,然后转到 http://localhost:7000;你应该看见像这样的窗口:

 title=

你成功的设置了端口转发!

警告: 如果你选择在公网上暴露 TCP 端口 22 ,不要使用易于猜测的登录凭证。你将接受来自全世界的登录请求,它们使用常见的、标准的登录凭证以尝试登录你的 Linux 机器。相反,只允许已知的用户登录。这种登录限制可以通过 公钥加密 来实现,它使用一个密钥对,其中公钥存储在 SSH 主机上,而私钥保留在客户端。

调试

如果你难以连接你的 Linux 机器,你可以跟踪你的 SSH 守护进程的处理过程:

journalctl -f -u sshd

这是一个普通的登录进程,但是其日志级别为 DEBUG,它看起来是这样的 :

 title=

了解更多

这篇文章几乎没有涉及到使用 SSH 的方法。如果你正在寻找一个特定用例的信息,你也许可以在互联网中找到无数的教程。我在工作中使用 PuTTY ,因为它易于设置,在两个操作系统间又具有良好的可操作性,使得它成为连接解决方案里的瑞士军刀。

(文内图片来自:Stephan Avenwedde,CC BY-SA 4.0


via: https://opensource.com/article/21/6/ssh-windows

作者:Stephan Avenwedde 选题:lujun9972 译者:yjacks 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

微软商店新规禁止上架苹果的浏览器

在大家都关注微软商店针对开源软件售卖的 新规定 的时候,这批新条款中还有专门针对苹果的 WebKit 浏览器内核的限制:如果要想在微软商店提交浏览器产品的话,只能使用 Chromium 内核和 Gecko 内核,其他内核例如 WebKit 等都是不被允许的。微软给出的解释是平台兼容性和安全性考虑。WebKit 主要是苹果的 Safari 浏览器所使用的引擎,而 Chromium 是微软 Edge 和谷歌 Chrome 所使用的内核,Gecko 是 Firefox 使用的内核。这和苹果在在 iOS 和 iPadOS 上的政策如出一辙,苹果也禁止第三方浏览器内核,所有苹果商店上架的浏览器都必须使用 WebKit,所以 iPhone 上的 Chrome 只是个套皮版本,内核并非 Chromium。

消息来源:The Register
老王点评:你做得了初一,就别怪我做十五。我想微软是等着看欧盟对苹果 iOS 上的 WebKit 独占的裁决结果吧。

谷歌应用商店将恢复应用权限列表

正如我们之前 报道 的,谷歌应用商店新增加了由开发者提供的“数据安全”部分,并删除了旧的“应用程序权限列表”。我当时认为此举不妥,应该保留这个权限列表,它是根据应用安装时申请的权限自动扫描生成的。现在,看起来谷歌收到了大家的反馈,安卓的开发人员在推特上表示,“你认为谷歌商店中的应用权限部分很有用,我们决定恢复它。”权限列表代表一个应用程序访问特定数据的能力,而数据安全的重点是一个应用程序收集和与第三方分享的内容。谷歌警告那些没有完全填写数据安全表格的应用尽快更新,否则将无法更新应用,甚至会被删除。

消息来源:9to5google
老王点评:这么简单的事情,都需要社区提醒。不过能够从善如流还是不错的。

SUSE 也发布了基于网页的 Linux 发行版安装程序

之前我们 报道 过,红帽正在开发基于网页的 Anaconda 安装程序。而 SUSE 的工程师们也在做类似的工作。这个名为 D-Installer 的安装程序建立在 YaST 之上,最近发布了 0.4 版。D-Installer 是今年年初宣布的,并于 3 月份发布了一个实验性版本。这个安装程序有一个多进程架构,可以支持安装多个产品,因此用户可以在安装时选择 openSUSE Tumbleweed / Leap Micro / Leap 等不同形态,并简化工作流程。

消息来源:Phoronix
老王点评:明明是 SUSE 先搞的,怎么就被红帽抢了戏了呢。:smile:

GNU 调试器是一个发现程序缺陷的强大工具。

如果你是一个程序员,想在你的软件增加某些功能,你首先考虑实现它的方法:例如写一个方法、定义一个类,或者创建新的数据类型。然后你用编译器或解释器可以理解的编程语言来实现这个功能。但是,如果你觉得你所有代码都正确,但是编译器或解释器依然无法理解你的指令怎么办?如果软件大多数情况下都运行良好,但是在某些环境下出现缺陷怎么办?这种情况下,你得知道如何正确使用调试器找到问题的根源。

GNU 调试器 GNU Project Debugger GDB)是一个发现项目缺陷的强大工具。它通过追踪程序运行过程中发生了什么来帮助你发现程序错误或崩溃的原因。(LCTT 校注:GDB 全程是“GNU Project Debugger”,即 “GNU 项目调试器”,但是通常我们简称为“GNU 调试器”)

本文是 GDB 基本用法的实践教程。请跟随示例,打开命令行并克隆此仓库:

git clone https://github.com/hANSIc99/core_dump_example.git

快捷方式

GDB 的每条命令都可以缩短。例如:显示设定的断点的 info break 命令可以被缩短为 i break。你可能在其他地方看到过这种缩写,但在本文中,为了清晰展现使用的函数,我将所写出整个命令。

命令行参数

你可以将 GDB 附加到每个可执行文件。进入你克隆的仓库(core_dump_example),运行 make 进行编译。你现在能看到一个名为 coredump 的可执行文件。(更多信息,请参考我的文章《创建和调试 Linux 的转储文件》。)

要将 GDB 附加到这个可执行文件,请输入: gdb coredump

你的输出应如下所示:

gdb coredump output

返回结果显示没有找到调试符号。

调试信息是 目标文件 object file (可执行文件)的组成部分,调试信息包括数据类型、函数签名、源代码和操作码之间的关系。此时,你有两种选择:

  • 继续调试汇编代码(参见下文“无符号调试”)
  • 使用调试信息进行编译,参见下一节内容

使用调试信息进行编译

为了在二进制文件中包含调试信息,你必须重新编译。打开 Makefile,删除第 9 行的注释标签(#)后重新编译:

CFLAGS =-Wall -Werror -std=c++11 -g

-g 告诉编译器包含调试信息。运行 make clean,接着运行 make,然后再次调用 GDB。你得到如下输出后就可以调试代码了:

GDB output with symbols

新增的调试信息会增加可执行文件的大小。在这种情况下,执行文件增加了 2.5 倍(从 26,088 字节 增加到 65,480 字节)。

输入 run -c1,使用 -c1 开关启动程序。当程序运行到达 State_4 时将崩溃:

gdb output crash on c1 switch

你可以检索有关程序的其他信息,info source 命令提供了当前文件的信息:

gdb info source output

  • 101 行代码
  • 语言: C++
  • 编译器(版本、调优、架构、调试标志、语言标准)
  • 调试格式:DWARF 2
  • 没有预处理器宏指令(使用 GCC 编译时,宏仅在 使用 -g3 标志编译 时可用)。

info shared 命令打印了动态库列表机器在虚拟地址空间的地址,它们在启动时被加载到该地址,以便程序运行:

gdb info shared output

如果你想了解 Linux 中的库处理方式,请参见我的文章 在 Linux 中如何处理动态库和静态库

调试程序

你可能已经注意到,你可以在 GDB 中使用 run 命令启动程序。run 命令接受命令行参数,就像从控制台启动程序一样。-c1 开关会导致程序在第 4 阶段崩溃。要从头开始运行程序,你不用退出 GDB,只需再次运行 run 命令。如果没有 -c1 开关,程序将陷入死循环,你必须使用 Ctrl+C 来结束死循环。

gdb output stopped by sigint

你也可以一步一步运行程序。在 C/C++ 中,入口是 main 函数。使用 list main 命令打开显示 main 函数的部分源代码:

gdb output list main

main 函数在第 33 行,因此可以输入 break 33 在 33 行添加断点:

gdb output breakpoint added

输入 run 运行程序。正如预期的那样,程序在 main 函数处停止。输入 layout src 并排查看源代码:

gdb output break at main

你现在处于 GDB 的文本用户界面(TUI)模式。可以使用键盘向上和向下箭头键滚动查看源代码。

GDB 高亮显示当前执行行。你可以输入 nextn)命令逐行执行命令。如果你没有指定新的命令,GBD 会执行上一条命令。要逐行运行代码,只需按回车键。

有时,你会发现文本的输出有点显示不正常:

gdb output corrupted

如果发生这种情况,请按 Ctrl+L 重置屏幕。

使用 Ctrl+X+A 可以随时进入和退出 TUI 模式。你可以在手册中找到 其他的键绑定

要退出 GDB,只需输入 quit

设置监察点

这个示例程序的核心是一个在无限循环中运行的状态机。n_state 变量枚举了当前所有状态:

while(true){
        switch(n_state){
        case State_1:
                std::cout << "State_1 reached" << std::flush;
                n_state = State_2;
                break;
        case State_2:
                std::cout << "State_2 reached" << std::flush;
                n_state = State_3;
                break;
        
        (.....)
        
        }
}

如果你希望当 n_state 的值为 State_5 时停止程序。为此,请在 main 函数处停止程序并为 n_state 设置监察点:

watch n_state == State_5

只有当所需的变量在当前上下文中可用时,使用变量名设置监察点才有效。

当你输入 continue 继续运行程序时,你会得到如下输出:

gdb output stop on watchpoint_1

如果你继续运行程序,当监察点表达式评估为 false 时 GDB 将停止:

gdb output stop on watchpoint_2

你可以为一般的值变化、特定的值、读取或写入时来设置监察点。

更改断点和监察点

输入 info watchpoints 打印先前设置的监察点列表:

gdb output info watchpoints

删除断点和监察点

如你所见,监察点就是数字。要删除特定的监察点,请先输入 delete 后输入监察点的编号。例如,我的监察点编号为 2;要删除此监察点,输入 delete 2

注意: 如果你使用 delete 而没有指定数字,所有 监察点和断点将被删除。

这同样适用于断点。在下面的截屏中,我添加了几个断点,输入 info breakpoint 打印断点列表:

gdb output info breakpoints

要删除单个断点,请先输入 delete 后输入断点的编号。另外一种方式:你可以通过指定断点的行号来删除断点。例如,clear 78 命令将删除第 78 行设置的断点号 7。

禁用或启用断点和监察点

除了删除断点或监察点之外,你可以通过输入 disable,后输入编号禁用断点或监察点。在下文中,断点 3 和 4 被禁用,并在代码窗口中用减号标记:

disabled breakpoints

也可以通过输入类似 disable 2 - 4 修改某个范围内的断点或监察点。如果要重新激活这些点,请输入 enable,然后输入它们的编号。

条件断点

首先,输入 delete 删除所有断点和监察点。你仍然想使程序停在 main 函数处,如果你不想指定行号,可以通过直接指明该函数来添加断点。输入 break main 从而在 main 函数处添加断点。

输入 run 从头开始运行程序,程序将在 main 函数处停止。

main 函数包括变量 n_state_3_count,当状态机达到状态 3 时,该变量会递增。

基于 n_state_3_count 的值添加一个条件断点,请输入:

break 54 if n_state_3_count == 3

Set conditional breakpoint

继续运行程序。程序将在第 54 行停止之前运行状态机 3 次。要查看 n_state_3_count 的值,请输入:

print n_state_3_count

print variable

使断点成为条件断点

你也可以使现有断点成为条件断点。用 clear 54 命令删除最近添加的断点,并通过输入 break 54 命令添加一个简单的断点。你可以输入以下内容使此断点成为条件断点:

condition 3 n_state_3_count == 9

3 指的是断点编号。

modify breakpoint

在其他源文件中设置断点

如果你的程序由多个源文件组成,你可以在行号前指定文件名来设置断点,例如,break main. cpp:54

捕捉点

除了断点和监察点之外,你还可以设置捕获点。捕获点适用于执行系统调用、加载共享库或引发异常等事件。

要捕获用于写入 STDOUT 的 write 系统调用,请输入:

catch syscall write

catch syscall write output

每当程序写入控制台输出时,GDB 将中断执行。

在手册中,你可以找到一整章关于 断点、监察点和捕捉点 的内容。

评估和操作符号

print 命令可以打印变量的值。一般语法是 print <表达式> <值>。修改变量的值,请输入:

set variable <variable-name> <new-value>.

在下面的截屏中,我将变量 n_state_3_count 的值设为 123

catch syscall write output

/x 表达式以十六进制打印值;使用 & 运算符,你可以打印虚拟地址空间内的地址。

如果你不确定某个符号的数据类型,可以使用 whatis 来查明。

whatis output

如果你要列出 main 函数范围内可用的所有变量,请输入 info scope main :

info scope main output

DW_OP_fbreg 值是指基于当前子程序的堆栈偏移量。

或者,如果你已经在一个函数中并且想要列出当前堆栈帧上的所有变量,你可以使用 info locals :

info locals output

查看手册以了解更多 检查符号 的内容。

附加调试到一个正在运行的进程

gdb attach <进程 ID> 命令允许你通过指定进程 ID(PID)附加到一个已经在运行的进程进行调试。幸运的是,coredump 程序将其当前 PID 打印到屏幕上,因此你不必使用 pstop 手动查找 PID。

启动 coredump 应用程序的一个实例:

./coredump

coredump application

操作系统显示 PID 为 2849。打开一个单独的控制台窗口,移动到 coredump 应用程序的根目录,然后用 GDB 附加到该进程进行调试:

gdb attach 2849

attach GDB to coredump

当你用 GDB 附加到进程时,GDB 会立即停止进程运行。输入 layout srcbacktrace 来检查调用堆栈:

layout src and backtrace output

输出显示在 main.cpp 第 92 行调用 std::this_thread::sleep_for<...>(. ..) 函数时进程中断。

只要你退出 GDB,该进程将继续运行。

你可以在 GDB 手册中找到有关 附加调试正在运行的进程 的更多信息。

在堆栈中移动

在命令窗口,输入 up 两次可以在堆栈中向上移动到 main.cpp :

moving up the stack to main.cpp

通常,编译器将为每个函数或方法创建一个子程序。每个子程序都有自己的栈帧,所以在栈帧中向上移动意味着在调用栈中向上移动。

你可以在手册中找到有关 堆栈计算 的更多信息。

指定源文件

当调试一个已经在运行的进程时,GDB 将在当前工作目录中寻找源文件。你也可以使用 目录命令 手动指定源目录。

评估转储文件

阅读 创建和调试 Linux 的转储文件 了解有关此主题的信息。

参考文章太长,简单来说就是:

  1. 假设你使用的是最新版本的 Fedora
  2. 使用 -c1 开关调用 coredump:coredump -c1

Crash meme

  1. 使用 GDB 加载最新的转储文件:coredumpctl debug
  2. 打开 TUI 模式并输入 layout src

coredump output

backtrace 的输出显示崩溃发生在距离 main.cpp 五个栈帧之外。回车直接跳转到 main.cpp 中的错误代码行:

up 5 output

看源码发现程序试图释放一个内存管理函数没有返回的指针。这会导致未定义的行为并引起 SIGABRT

无符号调试

如果没有源代码,调试就会变得非常困难。当我在尝试解决逆向工程的挑战时,我第一次体验到了这一点。了解一些 汇编语言 的知识会很有用。

我们用例子看看它是如何运行的。

找到根目录,打开 Makefile,然后像下面一样编辑第 9 行:

CFLAGS =-Wall -Werror -std=c++11 #-g

要重新编译程序,先运行 make clean,再运行 make,最后启动 GDB。该程序不再有任何调试符号来引导源代码的走向。

no debugging symbols

info file 命令显示二进制文件的内存区域和入口点:

info file output

.text 区段始终从入口点开始,其中包含实际的操作码。要在入口点添加断点,输入 break *0x401110 然后输入 run 开始运行程序:

breakpoint at the entry point

要在某个地址设置断点,使用取消引用运算符 * 来指定地址。

选择反汇编程序风格

在深入研究汇编之前,你可以选择要使用的 汇编风格。 GDB 默认是 AT&T,但我更喜欢 Intel 语法。变更风格如下:

set disassembly-flavor intel

changing assembly flavor

现在输入 layout asm 调出汇编代码窗口,输入 layout reg 调出寄存器窗口。你现在应该看到如下输出:

layout asm and layout reg output

保存配置文件

尽管你已经输入了许多命令,但实际上还没有开始调试。如果你正在大量调试应用程序或尝试解决逆向工程的难题,则将 GDB 特定设置保存在文件中会很有用。

该项目的 GitHub 存储库中的 gdbinit 配置文件包含最近使用的命令:

set disassembly-flavor intel
set write on
break *0x401110
run -c2
layout asm
layout reg

set write on 命令使你能够在程序运行期间修改二进制文件。

退出 GDB 并使用配置文件重新启动 GDB : gdb -x gdbinit coredump

阅读指令

应用 c2 开关后,程序将崩溃。程序在入口函数处停止,因此你必须写入 continue 才能继续运行:

continuing execution after crash

idiv 指令进行整数除法运算:RAX 寄存器中为被除数,指定参数为除数。商被加载到 RAX 寄存器中,余数被加载到 RDX 中。

从寄存器角度,你可以看到 RAX 包含 5,因此你必须找出存储堆栈中位置为 rbp-0x4 的值。

读取内存

要读取原始内存内容,你必须指定比读取符号更多的参数。在汇编输出中向上滚动一点,可以看到堆栈的划分:

stack division output

你最感兴趣的应该是 rbp-0x4 的值,因为它是 idiv 的存储参数。你可以从截图中看到rbp-0x8 位置的下一个变量,所以 rbp-0x4 位置的变量是 4 字节宽。

在 GDB 中,你可以使用 x 命令查看任何内存内容:

x/ < 可选参数 nfu > < 内存地址 addr >

可选参数:

  • n:单元大小的重复计数(默认值:1)
  • f:格式说明符,如 printf
  • u:单元大小

    • b:字节
    • h:半字(2 个字节)
    • w: 字(4 个字节)(默认)
    • g: 双字(8 个字节)

要打印 rbp-0x4 的值,请输入 x/u $rbp-4 :

print value

如果你能记住这种模式,则可以直接查看内存。参见手册中的 查看内存 部分。

操作汇编

子程序 zeroDivide() 发生运算异常。当你用向上箭头键向上滚动一点时,你会找到下面信息:

0x401211 <_Z10zeroDividev>              push   rbp
0x401212 <_Z10zeroDividev+1>            mov    rbp,rsp

这被称为 函数前言

  1. 调用函数的基指针(rbp)存放在栈上
  2. 栈指针(rsp)的值被加载到基指针(rbp

完全跳过这个子程序。你可以使用 backtrace 查看调用堆栈。在 main 函数之前只有一个堆栈帧,所以你可以用一次 up 回到 main :

Callstack assembly

在你的 main 函数中,你会找到下面信息:

0x401431 <main+497>     cmp    BYTE PTR [rbp-0x12],0x0
0x401435 <main+501>     je     0x40145f <main+543>
0x401437 <main+503>     call   0x401211<_Z10zeroDividev>

子程序 zeroDivide() 仅在 jump equal (je)true 时进入。你可以轻松地将其替换为 jump-not-equal (jne) 指令,该指令的操作码为 0x75(假设你使用的是 x86/64 架构;其他架构上的操作码不同)。输入 run 重新启动程序。当程序在入口函数处停止时,设置操作码:

set *(unsigned char*)0x401435 = 0x75

最后,输入 continue 。该程序将跳过子程序 zeroDivide() 并且不会再崩溃。

总结

你会在许多集成开发环境(IDE)中发现 GDB 运行在后台,包括 Qt Creator 和 VSCodium 的 本地调试 扩展。

GDB in VSCodium

了解如何充分利用 GDB 的功能很有用。一般情况下,并非所有 GDB 的功能都可以在 IDE 中使用,因此你可以从命令行使用 GDB 的经验中受益。


via: https://opensource.com/article/21/1/gnu-project-debugger

作者:Stephan Avenwedde 选题:lkxed 译者:Maisie-x 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

戴尔的 XPS 13 Plus 开发者版可能是第一款为 Ubuntu 22.04 LTS 认证的笔记本电脑。

xps 13 dev

戴尔 XPS 是一个适合专业人士和商业用户的高端笔记本电脑系列。

而且它也是运行 Linux 的最受欢迎的笔记本电脑之一。如果你一直想得到一台为最新的 Ubuntu 量身定做的戴尔 XPS 笔记本电脑,那么 戴尔 XPS 13 Plus 开发者版 就是为你准备的。

13 英寸 XPS 笔记本电脑的开发者版现在已经通过认证,可以使用 Ubuntu 22.04 LTS 完美工作。

这些经过认证的设备都经过了测试,以获得最佳体验,确保每台笔记本电脑的功能都能按预期工作。

换句话说,你可以找到预装 Ubuntu 22.04 LTS 的优质笔记本电脑,不必担心其开箱即用的体验。而且,如果你已经有一台 XPS 13 Plus 笔记本电脑,你也可以手动安装 Ubuntu 22.04 来获得同样的优化体验。

这款笔记本应该是 TUXEDO Pulse 15HP Dev One 的绝佳替代品。

戴尔的高级笔记本电脑拥有顺滑的 Ubuntu 体验

虽然我们可以在任何笔记本电脑上安装 Linux 发行版,但可能并不总是一种方便的体验。

从 Wi-Fi 兼容性问题到指纹认证,任何事情都可能出错。除非一个设备与一个操作系统正式兼容,否则你只能带着失败的几率去尝试。

然而,戴尔在 Ubuntu 领域是非常有名的,它提供的笔记本电脑在 Ubuntu 的最新版本中完全可以正常工作。戴尔的 XPS 13 Plus 开发者版运行的是经 Canonical 认证的最新推出的 Ubuntu 22.04 LTS。

你可以查看我们的 Ubuntu 22.04 LTS 特色 文章,探索你可以从它那里得到什么。

戴尔的产品经理就他们与 Canonical 的长期合作分享了一些见解。

“XPS 是戴尔的创新门户 —— 从对尖端技术的应用,到新用户界面和体验式设计的实验。”戴尔技术公司的 Linux 操作系统产品经理 Jaewook Woo 说:“通过将 Ubuntu 22.04 LTS 的增强性能和电源管理功能引入我们最先进的高端笔记本电脑,戴尔和 Canonical 加强了我们的共同承诺,即继续为使用 Ubuntu 的开发者提供最佳的计算体验。”

戴尔 XPS 13 Plus 开发者版提供了令人兴奋的规格,包括:

  • 四扬声器设计
  • 高达 4K+ 分辨率的 OLED 显示屏
  • M.2 PCIe Gen 4 NVMe SSD
  • 高达 32GB、LPDDR5 5200MHz 内存

这款笔记本电脑将于 2022 年 8 月在美国、加拿大和部分欧洲国家预装 Ubuntu 22.04 LTS 发售。如果你想买一台,你可能想关注一下 戴尔的 XPS 13 Plus 产品页面

Dell XPS 13 Plus

via: https://news.itsfoss.com/dell-xps-13-plus-dev-ubuntu-certified/

作者:Ankush Das 选题:lkxed 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出