免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4028 | 回复: 6
打印 上一主题 下一主题

内核线程 栈回溯 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-08 17:50 |只看该作者 |倒序浏览
如题:内核线程,怎么进行栈回溯?用户态的进程,我们可以用gdb进行回溯,内核线程回溯,比如我要回溯pid=1的内核线程,gdb后显示如下:
(gdb) attach 1
Attaching to process 1
ptrace: Operation not permitted.
,达人请指教怎么进行内核线程栈回溯?

论坛徽章:
0
2 [报告]
发表于 2012-02-08 22:24 |只看该作者
如题:内核线程,怎么进行栈回溯?用户态的进程,我们可以用gdb进行回溯,内核线程回溯,比如我要回溯pid=1的内核线程,gdb后显示如下:
(gdb) attach 1
Attaching to process 1
ptrace: Operation not permitted.
,达人请指教怎么进行内核线程栈回溯?

===========================================
以前写的一篇文章 -- 解密Linux kernel中的内核线程 ,注意第一帖中提到的一个调试小技巧。


   

论坛徽章:
0
3 [报告]
发表于 2012-02-09 09:32 |只看该作者
先谢谢,看看先回复 2# MagicBoy2010


   

论坛徽章:
0
4 [报告]
发表于 2012-02-09 10:42 |只看该作者
回复 2# MagicBoy2010

你好,用你的方法试了下,把do_fork中的CLONE_UNTRACED flag移除,重新编译内核。然后我用gdb对内核线程进行栈回溯,线程pid=1跟踪如下,
Attaching to program: /sbin/init, process 1

warning: process 1 is a cloned process
Reading symbols from /lib64/libcrypt.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libcrypt.so.1
Reading symbols from /lib64/libm.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libm.so.6
Reading symbols from /lib64/libc.so.6...
(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld.so.1

0x00000055616e7960 in wait () from /lib64/libc.so.6
(gdb) #0  0x00000055616e7960 in wait () from /lib64/libc.so.6
#1  0x0000000120041144 in ?? ()
warning: GDB can't find the start of the function at 0x120041143.

    GDB is unable to find the start of the function at 0x120041143
and thus can't determine the size of that function's stack frame.
This means that GDB may be unable to access that stack frame, or
the frames below it.
    This problem is most likely caused by an invalid program counter or
stack pointer.
    However, if you think GDB should simply search farther back
from 0x120041143 for code which looks like the beginning of a
function, you can increase the range of the search using the `set
heuristic-fence-post' command.
其它的内核线程回溯不了吗?
   

论坛徽章:
0
5 [报告]
发表于 2012-02-09 11:02 |只看该作者
其他内核线程如果你想trace它们的话,必须在内核线程创建时移除禁止trace的标志位。另外,为了更好地调试,建议关闭编译器的优化选项同时加入符号表。

论坛徽章:
0
6 [报告]
发表于 2012-02-14 15:33 |只看该作者
回复 5# MagicBoy2010


    谢谢,修改了kernel_thread这个函数里面的do_fork的标志位,就是移除了CLONE_UNTRACED flag移除,然后编译出来的内核,是不是
意思说,之后我们用pid = kernel_thread(thread_func, NULL, CLONE_KERNEL);
这样方式创建的内核线程就是可以gdb了?因为我发现改过了修改了kernel_thread这个函数里面的do_fork的标志位。只有pid=1
的内核线程有作用,其它的比如2 ,3等都没有作用attach的时候还是拒绝访问,求解释,或者能告诉我怎么进行内核线程的栈回溯???

论坛徽章:
0
7 [报告]
发表于 2012-02-14 22:07 |只看该作者
谢谢,修改了kernel_thread这个函数里面的do_fork的标志位,就是移除了CLONE_UNTRACED flag移除,然后编译出来的内核,是不是
意思说,之后我们用pid = kernel_thread(thread_func, NULL, CLONE_KERNEL);
这样方式创建的内核线程就是可以gdb了?因为我发现改过了修改了kernel_thread这个函数里面的do_fork的标志位。只有pid=1
的内核线程有作用,其它的比如2 ,3等都没有作用attach的时候还是拒绝访问,求解释,或者能告诉我怎么进行内核线程的栈回溯???

==================================
从内核的角度,你移除UNTRACED标志就允许新的内核线程被trace,你出现的问题可能更多跟gdb有关,就是你attach到父进程的话,如何trace子进程。可以去google一下set follow-fork-mode child|parent


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP