我正在为特定机器上即将推出的OpenSSL 1.1.0进行挂起自检测试。我曾尝试两次调试此问题,导致两个无响应的GDB和两个挂起的进程:
$ ps -A | grep afalgtest
1030 pts/0 00:00:00 afalgtest
1196 pts/0 00:00:00 afalgtest
我能够杀死GDB,但我无法杀死挂起的进程。
根据/proc/<pid>/syscall
,两者都在系统调用248中:
via:test$ sudo cat /proc/1030/syscall
248 0xb7fd6000 0x1 0xbfff98d4 0xb7fb9270 0xbfff98e0 0xb7ec45f7 0xbfff986c 0xb7fdbbe8
via:test$ sudo cat /proc/1196/syscall
248 0xb7fd6000 0x1 0xbfff98d4 0xb7fb9270 0xbfff98e0 0xb7ec45f7 0xbfff986c 0xb7fdbbe8
我正在使用威盛C7-D处理器运行一台机器,它需要Lubuntu 15,因为它是支持威盛PM400图形芯片组的少数发行版之一。 Lubuntu 15使用4.2内核:
$ uname -a
Linux via 4.2.0-30-generic #36-Ubuntu SMP Fri Feb 26 00:57:19 UTC 2016 i686 i686 i686 GNU/Linux
下一步是:
$ cat /usr/include/asm-generic/unistd.h | grep 248
$
什么都不返回。接下来,cat'ing unistd.h
:
...
/*
* Architectures may provide up to 16 syscalls of their own
* starting with this value.
*/
#define __NR_arch_specific_syscall 244
#define __NR_wait4 260
__SC_COMP(__NR_wait4, sys_wait4, compat_sys_wait4)
#define __NR_prlimit64 261
__SYSCALL(__NR_prlimit64, sys_prlimit64)
#define __NR_fanotify_init 262
__SYSCALL(__NR_fanotify_init, sys_fanotify_init)
#define __NR_fanotify_mark 263
...
以防248
为0x248
:
$ cat /usr/include/asm-generic/unistd.h | grep 584
$
所以我的问题是,如何确定进程挂起的系统调用?
看来我有最新的内核头文件:
$ sudo apt-get install linux-headers-$(uname -r)
Reading package lists... Done
Building dependency tree
Reading state information... Done
linux-headers-4.2.0-30-generic is already the newest version.
linux-headers-4.2.0-30-generic set to manually installed.
答案 0 :(得分:1)
系统调用号是十进制的。您正在寻找的Syscall表可以在arch / x86 / entry / syscalls / syscall_32.tbl中找到。无论如何,您正在检查错误的文件。你想看到的是/ stack文件中提供的整个回溯。内核非常好,不仅可以展开堆栈,还可以解析所有符号。或者,您可以使用调试器(名为crash)来检查实时内核。