systemtap调试linux内核源码,用systemtap来修改下linux内核变量的值

我们在探索linux内核的时候,经常需要调整下变量的值,看它对系统的影响。如果这个值没有透过/proc来修改的话,那只能编译内核。这个步骤是非常繁琐的。现在我们有systemtap这个利器来帮忙了。

演示如下:

我们通过修改过

extern int sysctl_tcp_fin_timeout;的值来达到目的。是因为这个值是proc导出的 我们好验证是否成功。

root@localhost ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout

15000

[root@localhost ~]# cat test.stp

probe begin

{

printf("ready go\n");

}

probe kernel.function("do_tcp_setsockopt")

{

$sysctl_tcp_fin_timeout = $1

printf("sysctl_tcp_fin_timeout = %d\n", $sysctl_tcp_fin_timeout);

exit()

}

[root@localhost ~]# stap -g test.stp 18000

ready go

这个时候 stap在运行, 只是还没有触发do_tcp_setsockopt.

现在我们来触发

[root@localhost ~]# erl

Erlang R13B02 (erts-5.7.3) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.3  (abort with ^G)

1> {ok, LSock} = gen_tcp:listen(0, []).

{ok,#Port<0.437>}

2>

2> inet:setopts(LSock, [{nodelay,true}]).

ok

3>

Ok,这时候回头可以看到stap打出来以下:

sysctl_tcp_fin_timeout = 18000

我们来验证下:

root@localhost ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout

18000

OK,成功。

Tips:

1. stap对全局变量的写需要-g guru模式。

2. 全局变量必须在一个单元内的函数里面才可以修改, 而且必须是在内核上下文。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值