Messages in this thread | | | Subject | Re: Linux Kernel GDB tracepoint module 2010-8-30 release | From | Steven <> | Date | Sun, 05 Sep 2010 00:47:59 +0800 |
| |
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 > > > >
| |