- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在用vmware的debugstub调试linux内核进程的时候,发现了一个很奇怪的情况。我在 sys_execve 中设置断点并打开 chrome,它确实中断了,但我发现 thread_info 结构总是被 0 填充。
Breakpoint 1, SyS_execve (filename=139842677234776, argv=139842677234848, envp=139843191453696)
at /build/linux-lts-utopic-V0z0lI/linux-lts-utopic-3.16.0/fs/exec.c:1630
1630 in /build/linux-lts-utopic-V0z0lI/linux-lts-utopic-3.16.0/fs/exec.c
(gdb) set $hehe = (struct thread_info *)(((long)$rsp & 0xffffffffffffe000))
(gdb) print *$hehe
$21 = {
task = 0x0 <irq_stack_union>,
exec_domain = 0x0 <irq_stack_union>,
flags = 0,
status = 0,
cpu = 0,
saved_preempt_count = 0,
addr_limit = {
seg = 0
},
restart_block = {
fn = 0x0 <irq_stack_union>,
{
futex = {
uaddr = 0x0 <irq_stack_union>,
val = 0,
flags = 0,
bitset = 0,
time = 0,
uaddr2 = 0x0 <irq_stack_union>
},
nanosleep = {
clockid = 0,
rmtp = 0x0 <irq_stack_union>,
compat_rmtp = 0x0 <irq_stack_union>,
expires = 0
},
poll = {
ufds = 0x0 <irq_stack_union>,
nfds = 0,
has_timeout = 0,
tv_sec = 0,
tv_nsec = 0
}
}
},
sysenter_return = 0x0 <irq_stack_union>,
sig_on_uaccess_error = 0,
uaccess_err = 0
}
然后我在 32 位 ubuntu 14.04 中尝试了相同的操作,一切正常。
(gdb) set $hehe = (struct thread_info *)((long)$esp & 0xffffe000)
(gdb) print *$hehe
$1 = {task = 0xc1980a40 <init_task>, exec_domain = 0xc198ef80 <default_exec_domain>, flags = 0, status = 0, cpu = 0, saved_preempt_count = -2147483648,
addr_limit = {seg = 4294967295}, restart_block = {fn = 0xc106d520 <do_no_restart_syscall>, {futex = {uaddr = 0x0, val = 0, flags = 0, bitset = 0, time = 0,
uaddr2 = 0x0}, nanosleep = {clockid = 0, rmtp = 0x0, expires = 0}, poll = {ufds = 0x0, nfds = 0, has_timeout = 0, tv_sec = 0, tv_nsec = 0}}},
sysenter_return = 0x0, sig_on_uaccess_error = 0, uaccess_err = 0}
我想知道是什么让这些发生了。默认的 PAGE_SIZE 不是 4KB 吗?或者线程堆栈不是 THREAD_SIZE (2*PAGE_SIZE) 大?
最佳答案
堆栈为 16KB 已经有一段时间了。我不明白你为什么要玩猜谜游戏,也不明白你为什么要寻找 thread_info。如果您正在尝试获取 task_struct,您可以通过 %gs 获取它。
关于linux - 为什么linux(x86_64)中的thread_info结构被0填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35647769/
我读到线程使用 thread_info ,而 task_struct 是 thread_info 的成员,我怀疑进程也使用 thread_info 还是他们在为进程描述符条目分配内存时使用 task_
在阅读 Linux 内核源代码时,我发现一件事让我感到困惑。 在task_struct中,是这样写的 struct task_struct { #ifdef CONFIG_THREAD_INFO_IN
编辑:我创建了一个导致问题的独立应用程序。它通常需要超过 1000 次循环迭代(创建/运行/加入线程),有时直到几千次迭代才会崩溃: #include static void do_nothing(
我们的项目在多个平台上使用了一些 boost 1.48 库,包括 Windows、Mac、Android 和 IOS。 使用 IOS 时,我们能够始终如一地使项目的 IOS 版本崩溃(非常重要但可靠)
在 Linux 2.6 内核之前,struct task_struct存在于每个进程的内核堆栈的末尾。没有thread_info struct概念。但在Linux 2.6内核中,而不是task_str
我正在阅读 Bovet 和 Cesati 合着的 Understanding the Linux Kernel 一书(第 3 版,2005 年),他们在其中简要解释了 thread_info 结构通过
我读到 Linux 不支持线程或轻量级进程的概念,它认为内核线程与任何其他进程一样。然而,这个原则并没有很准确地反射(reflect)在代码中。我们看到保存进程状态信息的 task_struct(如果
我是一名优秀的程序员,十分优秀!