[prev in list] [next in list] [prev in thread] [next in thread] 

List:       user-mode-linux-user
Subject:    [uml-user] can't trace kmem_cache_init with gdb
From:       Real Name <enjoymindful () gmail ! com>
Date:       2014-08-16 15:27:31
Message-ID: 20140816152731.GA6653 () name
[Download RAW message or body]

hi,

 I can't trace kmem_cache_init function with GDB, because gdb jump to wrong source \
line. Is there anyone know how to fix this issue?


[real@name tmp]$ tar -Jxf linux-3.12.6.tar.xz 
[real@name tmp]$ cd linux-3.12.6/
[real@name linux-3.12.6]$ make ARCH=um defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
scripts/kconfig/conf --defconfig arch/x86/um/Kconfig
#
# configuration written to .config
#
[real@name linux-3.12.6]$ make ARCH=um linux 1>log.txt
arch/um/kernel/ptrace.c: In function ‘syscall_trace_enter':
arch/um/kernel/ptrace.c:178:32: warning: ignoring return value of \
‘tracehook_report_syscall_entry', declared with attribute warn_unused_result \
[-Wunused-result]  tracehook_report_syscall_entry(regs);
                                ^


[real@name linux-3.12.6]$ 
[real@name linux-3.12.6]$ cat gdb.txt 
file linux
handle SIGSEGV pass nostop noprint
handle SIGUSR1 pass nostop noprint

b kmem_cache_init
b create_boot_cache

r ubda=/home/real/uml/linux-3.12.6/Fedora20-x86-root_fs mem=256m
[real@name linux-3.12.6]$ 



[real@name linux-3.12.6]$ gdb -q  -x gdb.txt
Breakpoint 1 at 0x8050a57: file mm/slab.c, line 1512.
Breakpoint 2 at 0x804f7c5: file mm/slab_common.c, line 296.
Locating the bottom of the address space ... 0x10000
Locating the top of the address space ... 0xffffd000
Core dump limits :
	soft - 0
	hard - NONE
Checking that ptrace can change system call numbers...Detaching after fork from child \
process 16850. OK
Checking syscall emulation patch for ptrace...Detaching after fork from child process \
16851. OK
Checking advanced syscall emulation patch for ptrace...Detaching after fork from \
child process 16852. OK
Checking for tmpfs mount on /dev/shm.../dev/shm...nothing mounted on /dev/shm
Checking PROT_EXEC mmap in /tmp/...OK
Detaching after fork from child process 16853.
Checking for the skas3 patch in the host:
  - /proc/mm...not found: No such file or directory
  - PTRACE_FAULTINFO...Detaching after fork from child process 16854.
not found
  - PTRACE_LDT...Detaching after fork from child process 16855.
not found
UML running in SKAS0 mode

Breakpoint 1, kmem_cache_init () at mm/slab.c:1512
1512	{
Missing separate debuginfos, use: debuginfo-install glibc-2.17-20.fc19.i686
(gdb) c
Continuing.

Breakpoint 2, create_boot_cache (s=0x82bdaf8 <kmem_cache_boot>, name=0x82650f5 \
"kmem_cache", size=92,   flags=8192) at mm/slab_common.c:296
296	{
(gdb) n
299		s->name = name;
(gdb) 
296	{
(gdb) 
299		s->name = name;
(gdb) 
300		s->size = s->object_size = size;
(gdb) 
301		s->align = calculate_alignment(flags, ARCH_KMALLOC_MINALIGN, size);
(gdb) 
302		err = __kmem_cache_create(s, flags);
(gdb) s
__kmem_cache_create (cachep=0x82bdaf8 <kmem_cache_boot>, flags=8192) at \
mm/slab.c:2222 2222	{
(gdb) n
2226		size_t size = cachep->size;
(gdb) 
2251		if (size & (BYTES_PER_WORD - 1)) {
(gdb) 
2264		if (flags & SLAB_RED_ZONE) {
(gdb) 
2273		if (ralign < cachep->align) {
(gdb) 
2278			flags &= ~(SLAB_RED_ZONE | SLAB_STORE_USER);
(gdb) 
2282		cachep->align = ralign;
(gdb) 
2284		if (slab_is_available())
(gdb) p slab_state
$1 = DOWN
(gdb) where
#0  __kmem_cache_create (cachep=0x82bdaf8 <kmem_cache_boot>, flags=8192) at \
mm/slab.c:2284 #1  0x0804f7f6 in create_boot_cache (s=0x82bdaf8 <kmem_cache_boot>, \
name=0x82650f5 "kmem_cache",   size=92, flags=8192) at mm/slab_common.c:302
#2  0x08050b1b in kmem_cache_init () at mm/slab.c:1559
#3  0x08049486 in mm_init () at init/main.c:468
#4  start_kernel () at init/main.c:532
#5  0x0804a6d8 in start_kernel_proc (unused=0x0) at arch/um/kernel/skas/process.c:46
#6  0x08059323 in new_thread_handler () at arch/um/kernel/process.c:140
#7  0x00000000 in ?? ()
(gdb) l mm/slab.c:2284
2279		/*
2280		 * 4) Store it.
2281		 */
2282		cachep->align = ralign;
2283	
2284		if (slab_is_available())
2285			gfp = GFP_KERNEL;
2286		else
2287			gfp = GFP_NOWAIT;
2288	

(gdb) p slab_state
$2 = DOWN
(gdb) n
2285			gfp = GFP_KERNEL;
(gdb) n
2289		setup_node_pointer(cachep);
(gdb) n
2285			gfp = GFP_KERNEL;


Start from 2289, gdb start jump to wrong source line. GDB should jump to 
"2287			gfp = GFP_NOWAIT;"
But it never hit it. And from here, gdb can't match the execuable UML kernel with \
source.


(gdb) n
2327		if ((size >= (PAGE_SIZE >> 3)) && !slab_early_init &&



And I found that "file" command says the file format is different.
[real@name mm]$ pwd
/tmp/linux-3.12.6/mm
[real@name mm]$ file *.c | sort -k 2
percpu-vm.c:          ASCII text
filemap.c:            assembler source, ASCII text
memcontrol.c:         assembler source, ASCII text
ksm.c:                C source, ASCII text
mmap.c:               C source, ASCII text
rmap.c:               C source, ASCII text
slab.c:               C source, ASCII text
slob.c:               C source, ASCII text
slub.c:               C source, ASCII text

Why percpu-vm.c, filemap.c and memcontrol.c has different format?

thanks

------------------------------------------------------------------------------
_______________________________________________
User-mode-linux-user mailing list
User-mode-linux-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-user


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic