我正在尝试启用内核持久存储 (pstore) 以帮助调试一个模块,该模块在挂起时出现故障并冻结我的笔记本电脑,但我在这样做时遇到了困难。我的内核(4.1.20)配置相关参数是
# gunzip -c /proc/config.gz | grep PSTORE
CONFIG_CHROMEOS_PSTORE=m
CONFIG_PSTORE=y
CONFIG_PSTORE_CONSOLE=y
# CONFIG_PSTORE_PMSG is not set
# CONFIG_PSTORE_FTRACE is not set
CONFIG_PSTORE_RAM=m
Run Code Online (Sandbox Code Playgroud)
我也试过加载ramoops模块,但是当我这样做时
# cat /sys/module/pstore/parameters/backend
(null)
Run Code Online (Sandbox Code Playgroud)
它似乎没有启用任何东西。/sys/fs/pstore 也是空的,虽然 mount 说它已安装。我试图恐慌我的内核使用这个,但没有露面。
我究竟做错了什么?它甚至应该在普通笔记本电脑上工作,还是我完全在黑暗中?在寻找此功能时,我找不到太多东西。
通过执行以下操作,我可以myHandler()在bash命令之前执行一个函数:
function myHandler() {
...
}
trap 'myHandler' DEBUG
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够BASH_COMMAND根据以下运行时条件继续或中止即将执行的操作myHandler:
function myHandler() {
if ! myCondition ; then
abort the execution of BASH_COMMAND right here
fi
# Proceed with the execution of BASH_COMMAND
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
是否有我可以仔细阅读的日志文件,或者可以为我提供线索的设置?
我在 Ubuntu 16.04 中运行 GNOME nautilus 3.14.3(“文件”)。
我正在尝试为 LightDM 问候语创建自己的主题,具体来说是 GTK 的主题。我已经编译并安装了 tarball,但每次运行时lightdm-gtk-greeter都会收到以下消息:
** (lightdm-gtk-greeter:29217): WARNING **: No LIGHTDM_TO_SERVER_FD environment variable
Run Code Online (Sandbox Code Playgroud)
...如果我运行lightdm --test-mode,我只会看到通常的登录屏幕。文件 /etc/lightdm/lightdm.conf 似乎不存在,这对我来说似乎很奇怪。
我正在使用 Trisquel GNU/Linux 7.0。
我知道这set -x会让 Bash 用户进入调试模式,并且我觉得在调试模式下全职工作将帮助我更好地处理 Bash 中可能出现的问题。
我在使用时遇到问题set -x:
当我尝试使用我的发行版(Ubuntu 16.04)的本机制表符完成来完成目录名称时,我得到一个非常长且混乱的输出。
例如,$PWD我/var/www/html/运行以下任一命令:
cd ~/u[制表符补全完成u至ulcwe]
cd ~ && cd u[制表符补全完成u至ulcwe]
在这两个示例中,我都会得到非常长且混乱的输出:
+ return 0
+ local -a toks
+ local quoted x tmp
+ _quote_readline_by_ref '~/u' quoted
+ '[' -z '~/u' ']'
+ [[ ~/u == \'* ]]
+ [[ ~/u == \~* ]]
+ printf -v quoted '~%q' /u
+ [[ ~/u == …Run Code Online (Sandbox Code Playgroud) 这是在gdb中查看进程的虚拟内存的结果;我对此有一些疑问:
为什么虚拟内存的某些部分是重复的?比如我们的程序(stack6)和libc库重复了4次;如果他们把它们分成不同的部分,那为什么呢?为什么不把它们放在一起呢?
顶部路径(/opt/pro...)是我们虚拟内存的指令部分(文本部分)并且只包含指令吗?
为什么4个libc的大小不同?偏移量有什么关系,如果我们已经有了大小和起始地址,那么偏移量是什么?
数据、bss、内核和堆部分在哪里,为什么上图中的某些部分没有关于它们的信息?gdb 中是否有更好的选项可以实际显示所有部分?
有没有比 gdb 更好的程序可以更好地显示我们进程的虚拟内存部分?我只想对实际的虚拟内存有一个很好的视觉效果,哪个调试程序提供了最好的结果。
我提到的部分:
指定systemd.debug-shell=1为内核参数类型有效:当 systemd 启动挂起时,我可以通过 Alt+F9 切换到 shell。
但是这个外壳是完全不可能的,因为一个动画
[ *** ] A start job is running for Create Volatile Files and
Directories (4min 23s / no limit)
Run Code Online (Sandbox Code Playgroud)
横幅正在破坏我的提示和命令行输出。
因此,我的问题是:如何在我的 shell tty9 中禁用这个阻碍 systemd 的输出?
我可以将它显示在 tty1 中,即主控制台 - 但按原样,它使 systemd 调试外壳无法使用。
这是 Fedora 29 下的 systemd。
我为 sys_enter_openat 系统调用启用了 ftrace 事件跟踪。在 events/syscalls/sys_enter_openat/format 给出的相应输出格式是
print fmt: "dfd: 0x%08lx, filename: 0x%08lx, flags: 0x%08lx, mode: 0x%08lx", ((unsigned long)(REC->dfd)), ((unsigned long)(REC->filename)), ((unsigned long)(REC->flags)), ((unsigned long)(REC->mode))
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,ftrace 的示例输出行类似于
msm_irqbalance-1338 [000] ...1 211710.033931: sys_openat(dfd: ffffff9c, filename: 5af693f224, flags: 2, mode: 0)
Run Code Online (Sandbox Code Playgroud)
有没有办法改变输出格式,这样filename: 5af693f224可以显示为filename: <string>而不是hex(5af693f224)?
所以基本上有一种方法可以在跟踪特定事件(例如上面的 sys_enter_openat)到 ftrace 时更改输出格式。
我想这可以使用 systemtap 或 krpobe 实现,但我的设置目前不允许使用。
命令tail -f命令非常适合跟踪,并且在终端中它非常有帮助,例如,按回车键并输入类似的注释
-- after xyz change... --
Run Code Online (Sandbox Code Playgroud)
出于记录目的,我希望能够将尾部输出以及我的注释通过管道传输到第二个文件。这可能吗(除了手动复制和粘贴输出)?谢谢!
在过去的一段时间里,我一直在慢慢地开发一个业余内核,并且一直以来我一直在使用 GDB 和 QEMU 来调查内存位置和寄存器以及其他什么。然而,我最近擦除了我的 Mac 并安装了 macOS Big Sur 的新副本,虽然 Mojave 上自制软件的 GDB 能够很好地加载我的内核二进制文件,但在 Big Sur 上,它只是抛出以下错误消息:Reading symbols from ~/Kernel/bin/kernel... I'm sorry, Dave, I can't do that. Symbol format `elf32-i386' unknown.
我不知道是什么原因造成的,我使用的是自制软件 GDB 10.1 中的 GDB 股票版本。我也尝试使用自制软件中的 i386-elf-gdb 但这也不起作用。我什至尝试自己编译 GDB,并设置各种配置选项,例如 --enable-targets=all,并将目标设置为 i686-elf,但似乎没有任何效果,我的配置选项都不会在 macOS 上启用任何 GDB Big Sur,可以从源代码编译,也可以从自制软件下载,用于读取 elf32-i386 内核二进制文件。