Re: Linux Kernel GDB tracepoint module 2010-8-30 release

Steven
2010-09-04T16:48:17Z

On Sun, 2010-09-05 at 00:42 +0800, Hui Zhu wrote:
> Could you post the other part of this code? Then I can try to reproduce on it.

hello.c
------------------------------------------------
#include <linux/kthread.h>
#include <linux/module.h>
#include <linux/init.h>

static struct task_struct *test_task;
volatile struct timeval tv;
int year;

int test_thread(void *data)
{
volatile int cnt = 0;
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(1 * HZ); /* wait for the terminal ready */

while(1){
set_current_state(TASK_INTERRUPTIBLE); /* this is
required, or thread never sleep*/
if(kthread_should_stop()) break;

year = 2010;
do_gettimeofday (&tv);
printk("\ntv_sec: %d - %d\n", (int)tv.tv_sec, cnt);
cnt++;

do_gettimeofday (&tv);
printk("tv_sec: %d - %d\n", (int)tv.tv_sec, year);
cnt++;

//reschedule after 5 seconds(approximately)
schedule_timeout(60 * HZ);
}

return 0;
}

static int __init mt_init(void)
{
int err;
test_task = kthread_create(test_thread, NULL, "test_task");
if(IS_ERR(test_task)){
printk("Unable to start kernel thread.\n");
printk("Unable to start kernel thread.\n");
err = PTR_ERR(test_task);
test_task = NULL;
return err;
}
wake_up_process(test_task);
return 0;
}

static void __exit mt_cleanup(void)
{
if(test_task){
kthread_stop(test_task);
test_task = NULL;
}
}

module_init(mt_init);
module_exit(mt_cleanup);

MODULE_LICENSE("GPL");
------------------------------------------------

Makefile
------------------------------------------------
obj-m := hello.o

KERNELBUILD := /lib/modules/`uname -r`/build

default:
make -C $(KERNELBUILD) M=$(shell pwd) modules

clean:
rm -rf *.o *.cmd *.ko *.mod.c .tmp-versions *.symvers
------------------------------------------------

> Thanks,
> Hui
>
> On Sun, Sep 5, 2010 at 00:01, Steven <mqyoung@gmail.com> wrote:
> > Dear All,
> >
> > As I mentioned before, I could collect the variables of kernel function
> > such as vfs_readdir(ext3 is built in kernel not module). And I tried I
> > could collect variables of kernel's module(such as my ethernet card
> > driver 3c59x.ko). I will collect these info later.
> >
> > BUT, I can not collect the value of my testing module, neither global
> > nor local. I think there is some thing wrong with my compile option or
> > Makefile, any one know it? Thanks very much.
> >
> > Program:
> > -------------------------------------------------
> > 6 volatile struct timeval tv;
> > 7 int year;
> > 8
> > 9 int test_thread(void *data)
> > 10 {
> > 11 volatile int cnt = 0;
> > 12 set_current_state(TASK_INTERRUPTIBLE);
> > 13 schedule_timeout(1 * HZ); /* wait for the terminal ready */
> > 14
> > 15 while(1){
> > 16 set_current_state(TASK_INTERRUPTIBLE);
> > 17 if(kthread_should_stop()) break;
> > 18
> > 19 year = 2010;
> > 20 do_gettimeofday (&tv);
> > 21 printk("\ntv_sec: %d - %d\n", (int)tv.tv_sec, cnt);
> > 22 cnt++;
> > 23
> > 24 do_gettimeofday (&tv);
> > 25 printk("tv_sec: %d - %d\n", (int)tv.tv_sec, year);
> > 26 cnt++;
> > 27
> > 28 //reschedule after 5 seconds(approximately)
> > 29 schedule_timeout(60 * HZ);
> > 30 }
> > 31
> > 32 return 0;
> > 33 }
> > -------------------------------------------------
> >
> > Makefile
> > -------------------------------------------------
> > obj-m := hello.o
> >
> > KERNELBUILD := /lib/modules/`uname -r`/build
> >
> > default:
> > make -C $(KERNELBUILD) M=$(shell pwd) modules
> > -------------------------------------------------
> >
> >
> > Screen log
> > -------------------------------------------------
> > debian:/home/linux-2.6.33.6# /usr/local/bin/gdb vmlinux
> > GNU gdb (GDB) 7.2
> > Copyright (C) 2010 Free Software Foundation, Inc.
> > License GPLv3+: GNU GPL version 3 or later
> > <http://gnu.org/licenses/gpl.html>
> > This is free software: you are free to change and redistribute it.
> > There is NO WARRANTY, to the extent permitted by law. Type "show
> > copying"
> > and "show warranty" for details.
> > This GDB was configured as "i686-pc-linux-gnu".
> > For bug reporting instructions, please see:
> > <http://www.gnu.org/software/gdb/bugs/>...
> > Reading symbols from /home/linux-2.6.33.6/vmlinux...[ 3909.310118]
> > [ 3909.310124] tv_sec: 1283648666 - 16
> > [ 3909.315385] tv_sec: 1283648666 - 2010
> > done.
> > (gdb) target remote /proc/gtp
> > Remote debugging using /proc/gtp
> > 0x00000000 in ?? ()
> > (gdb) add-symbol-file /home/steven/hello/hello.ko 0xc8b2b000
> > add symbol table from file "/home/steven/hello/hello.ko" at
> > .text_addr = 0xc8b2b000
> > (y or n) y
> > Reading symbols from /home/steven/hello/hello.ko...done.
> > (gdb) trace /home/steven/hello/hello.c:22
> > Tracepoint 1 at 0xc8b2b094: file /home/steven/hello/hello.c, line 22.
> > (gdb) trace /home/steven/hello/hello.c:26
> > Tracepoint 2 at 0xc8b2b0c1: file /home/steven/hello/hello.c, line 26.
> > (gdb) actions 1
> > Enter actions for tracepoint 1, one per line.
> > End with a line saying just "end".
> >>
> >>collect tv, year, cnt
> >>end
> > (gdb) actions 2
> > Enter actions for tracepoint 2, one per line.
> > End with a line saying just "end".
> >>collect tv, year, cnt
> >>end
> > (gdb) tstart
> > [ 4029.328129]
> > [ 4029.328136] tv_sec: 1283648786 - 20
> > [ 4029.333456] tv_sec: 1283648786 - 2010
> > tstop
> > (gdb) tfind
> > Found trace frame 0, tracepoint 1
> > #0 0xc8b2b095 in test_thread (data=0x0)
> > at /home/steven/hello/hello.c:22
> > 22 cnt++;
> > (gdb) p tv
> > $1 = {tv_sec = 0, tv_usec = 0}
> > (gdb) p cnt
> > $2 = 0
> > (gdb) p year
> > $3 = 0
> > (gdb) tfind
> > Found trace frame 1, tracepoint 2
> > 0xc8b2b0c2 26 cnt++;
> > (gdb) p cnt
> > $4 = 0
> > (gdb) p tv
> > $5 = {tv_sec = 0, tv_usec = 0}
> > (gdb) p year
> > $6 = 0
> > -------------------------------------------------
> >
> > Thanks,
> > Steven
> >
> > On Sat, 2010-09-04 at 22:58 +0800, Hui Zhu wrote:
> >> On Sat, Sep 4, 2010 at 17:26, Steven <mqyoung@gmail.com> wrote:
> >> > On Sat, 2010-09-04 at 17:17 +0800, Hui Zhu wrote:
> >> >> On Sat, Sep 4, 2010 at 16:56, Steven <mqyoung@gmail.com> wrote:
> >> >> > On Sat, 2010-09-04 at 11:41 +0800, Hui Zhu wrote:
> >> >> >> BTW, looks GCC and GDB don't want handle the optimization debug
> >> >> >> trouble (all they want is rewrite the GCC in C++ :P).
> >> >> >> So I think make linux kernel can close optimization is better idea, do
> >> >> >> you know some way or some patch to do it?
> >> >> >>
> >> >> >
> >> >> > Just disable CONFIG_CC_OPTIMIZE_FOR_SIZE and modify the Makefile of
> >> >> > kernel:
> >> >> > KBUILD_CFLAGS += -O2
> >> >> > to
> >> >> > KBUILD_CFLAGS += -O0
> >> >>
> >> >> Cool, :)
> >> >>
> >> >> I try just change the compile option of readdir.c to without -O2, it
> >> >> works OK. I think maybe it's a GDB bug too.
> >> >> Could you try the second issue with gdb 7.2?
> >> >
> >> > I have covered the two issues in the previous mail that I could collect
> >> > both global variables and locals(-O0 kernel + gdb7.2):
> >> >
> >> > --------
> >> > (gdb) trace vfs_readdir
> >> > Tracepoint 3 at 0xc11756a0: file fs/readdir.c, line 24.
> >> > (gdb) actions
> >> > Enter actions for tracepoint 3, one per line.
> >> > End with a line saying just "end".
> >> > >collect *file
> >> > >end
> >> > (gdb) trace fs/readdir.c:29
> >> > Tracepoint 4 at 0xc11756ca: file fs/readdir.c, line 29.
> >> > (gdb) actions
> >> > Enter actions for tracepoint 4, one per line.
> >> > End with a line saying just "end".
> >> > >collect res
> >> > >end
> >> > (gdb) tstart
> >> > (gdb) tstop
> >> > (gdb) tfind
> >> > Found trace frame 0, tracepoint 3
> >> > #0 0xc11756a1 in vfs_readdir (file=0xc7b2cf00, filler=0,
> >> > buf=0x0)
> >> > at fs/readdir.c:24
> >> > 24 struct inode *inode =
> >> > file->f_path.dentry->d_inode;
> >> > (gdb) p *file
> >> > $4 = {f_u = {fu_list = {next = 0xc6dca500, prev = 0xc7ade480},
> >> > fu_rcuhead = {
> >> > next = 0xc6dca500, func = 0xc7ade480}}, f_path = {mnt =
> >> > 0xc6c05300,
> >> > dentry = 0xc761d440}, f_op = 0xc1709a20, f_lock = {{rlock =
> >> > {raw_lock = {
> >> > slock = 0}}}}, f_count = {counter = 2}, f_flags =
> >> > 624640,
> >> > f_mode = 29, f_pos = 0, f_owner = {lock = {raw_lock = {lock =
> >> > 16777216}},
> >> > = 0start = 0, size = 0, async_size = 0,
> >> > ra_pages = 32, mmap_miss = 0, prev_pos = -1}, f_version =
> >> > 0,
> >> > f_security = 0xc7b30120, private_data = 0x0, f_ep_links = {
> >> > next = 0xc7b2cf74, prev = 0xc7b2cf74}, f_mapping =
> >> > 0xc761c74c}
> >> > (gdb) p res
> >> > $5 = 0
> >> > (gdb) tfind
> >> > Found trace frame 1, tracepoint 4
> >> > 0xc11756cb 29 res =
> >> > security_file_permission(file, MAY_READ);
> >> > (gdb) p res
> >> > $6 = -20
> >> > --------
> >> >
> >> >
> >> >
> >>
> >> Great. :)
> >>
> >> Hui
> >
> >