gpt4 book ai didi

c - 是否可以在 gdb 中确定线程是在内核空间还是用户空间中执行(或阻塞)?

转载 作者:太空狗 更新时间:2023-10-29 15:39:53 25 4
gpt4 key购买 nike

考虑以下程序。

#include <unistd.h>

int main(){
sleep(1000);
}

如果我们在这个程序上运行 strace,在长时间 sleep 之前出现的最后一行如下。

nanosleep({1000, 0}, 

当程序处于休眠状态时,代码正在操作系统内核中执行(可能被阻止)。

当我在gdb下运行程序时,如果我在 sleep 中发送SIGINT,我可以收集关于主线程的各种信息,比如它的backtrace 和各种寄存器值。

gdb 中是否有某些表达式求值为 true 当且仅当线程必须跨越 syscall 边界才能再次在用户空间中执行代码?

理想情况下,会有一个跨平台的解决方案,但特定于平台的解决方案也很有用。

澄清:我不关心线程是否实际执行;只有它最近的程序计数器值是在内核代码还是用户代码中。

换句话说,gdb能否告诉我们某个线程是否已经进入内核但还没有退出内核?

最佳答案

Is there is some expression in gdb that evaluates to true if the thread must cross a syscall boundary before executing code in userspace again?

您可以尝试使用catch syscall nanosleep,参见documentation .

catch syscall nanosleep 在 2 个事件上停止:一个是调用系统调用,另一个是从系统调用返回。您可以使用 info breakpoints 查看此 catchpoint 的命中次数。如果是偶数,那么你应该在用户空间。如果它是奇数,那么你应该在内核空间中:

$ gdb -q a.out 
Reading symbols from a.out...done.
(gdb) catch syscall nanosleep
Catchpoint 1 (syscall 'nanosleep' [35])
(gdb) i b
Num Type Disp Enb Address What
1 catchpoint keep y syscall "nanosleep"
(gdb) r
Starting program: /home/ks1322/a.out
Missing separate debuginfos, use: dnf debuginfo-install glibc-2.27-8.fc28.x86_64

Catchpoint 1 (call to syscall nanosleep), 0x00007ffff7adeb54 in nanosleep () from /lib64/libc.so.6
(gdb) i b
Num Type Disp Enb Address What
1 catchpoint keep y syscall "nanosleep"
catchpoint already hit 1 time
(gdb) c
Continuing.

Catchpoint 1 (returned from syscall nanosleep), 0x00007ffff7adeb54 in nanosleep () from /lib64/libc.so.6
(gdb) i b
Num Type Disp Enb Address What
1 catchpoint keep y syscall "nanosleep"
catchpoint already hit 2 times
(gdb) c
Continuing.
[Inferior 1 (process 19515) exited normally]

关于c - 是否可以在 gdb 中确定线程是在内核空间还是用户空间中执行(或阻塞)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50364420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com