2011-11-23 23 views
10

मैं stacktrace देखने के लिए bt कमांड का उपयोग करने के रूप में देखें। उत्पादनजीडीबी | वैरिएबल तर्क सूची

(gdb) bt 
#0 0x001ae4cd in Debugger (message=0x1 "???\a") at /SourceCache/xnu/xnu-1228.7.58/osfmk/i386/AT386/model_dep.c:705 
#1 0x3bf97000 in ??() 
#2 0x0012b0fa in panic (str=0x5ef "") at /SourceCache/xnu/xnu-1228.7.58/osfmk/kern/debug.c:274 
#3 0x001a8cd4 in kernel_trap (state=0x51a67c80) at /SourceCache/xnu/xnu-1228.7.58/osfmk/i386/trap.c:680 
#4 0x0019ede5 in return_from_trap() at pmap.h:176 
#5 0x00132bea in __doprnt (fmt=<value temporarily unavailable, due to optimizations>, argp=0x51a67e6c, putc=0x38ad24 <kvprintf+33>, arg=0x51a67e48, radix=10) at /SourceCache/xnu/xnu-1228.7.58/osfmk/kern/printf.c:439 
#6 0x0038ad11 in kvprintf (fmt=0x1 "???\a", func=0x1, arg=0x1, radix=1, ap=0x51a67e84 "\\?\034I\"") at /SourceCache/xnu/xnu-1228.7.58/bsd/kern/subr_prf.c:525 
#7 0x491b5dac in com_my_drv_Log (format=0x491cbff8 "%s::%s:%n\n") at Logger.cpp:37 
#8 0x491b3d36 in MyDrv::init (this=0x5c1f200, properties=0x58a8040) at MyDrv.cpp:34 
#9 0x00412887 in IOService::probeCandidates (this=0x599a980, matches=0x58ade80) at /SourceCache/xnu/xnu-1228.7.58/iokit/Kernel/IOService.cpp:2512 
#10 0x004124ab in IOService::doServiceMatch (this=0x534180, options=8) at /SourceCache/xnu/xnu-1228.7.58/iokit/Kernel/IOService.cpp:2921 
#11 0x00411127 in _IOConfigThread::main (self=0x58c6790) at /SourceCache/xnu/xnu-1228.7.58/iokit/Kernel/IOService.cpp:3125 
(gdb) 

फ्रेम में है

#7 0x491b5dac in com_my_drv_Log 

मैं मानकों को पारित कर दिया है कि कैसे देख सकते हैं अपने हस्ताक्षर

void com_my_drv_Log (const char* format, ...); 
/* with the variable argument list */ 

साथ com_my_drv_Log?

+0

संभवतः प्रासंगिक: http://www.cocoabuilder.com/archive/cocoa/220209-gdb-of-va-alist.html – sehe

उत्तर

5

ऐसा लगता है कि यह इस तरह एक साधारण प्रोग्राम के लिए यह करने के लिए संभव है:

#include <stdarg.h> 
#include <stdio.h> 

void myfunc(const char *fmt, ...) 
{ 
     va_list args; 
     va_start(args, fmt); 
     vprintf(fmt, args); 
     va_end(args); 
     return; 
} 

int main(int argc, char *argv[]) 
{ 
     myfunc("test 1: %s %s\n", "one", "two"); 
     myfunc("test 2: %s %d %c\n", "apple", 222, 'y'); 
     return 0; 
} 

यहाँ नमूना gdb सत्र है:

$ gdb testprog 
GNU gdb (GDB) 7.1-debian 
[snip] 
Reading symbols from /home/user/testprog...done. 
(gdb) break myfunc 
Breakpoint 1 at 0x400552: file testprog.c, line 7. 
(gdb) run 
Starting program: /home/user/testprog 

Breakpoint 1, myfunc (fmt=0x4006f4 "test 1: %s %s\n") at testprog.c:7 
7    va_start(args, fmt); 
(gdb) # initialize args to hold correct values: 
(gdb) step 
8    vprintf(fmt, args); 
(gdb) # print first argument in "..." list which we know is a char*: 
(gdb) p *(char **)(((char *)args[0].reg_save_area)+args[0].gp_offset) 
$1 = 0x4006f0 "one" 

मैं इस सब का परीक्षण नहीं किया, इस link देखो पूर्ण समाधान के लिए। This blog भी उपयोगी होगा।

+0

धन्यवाद, यह मेरे में मदद की, वहाँ भी 'देखने पर ' हैडर उपयोगी था। –

3
 
(gdb) frame 8 

आपको कॉलर के फ्रेम में डाल देगा। पारित किए जा रहे तर्कों की जांच करें।

+0

मुझे लगता है कि प्रश्न परिवर्तनीय तर्क सूचियों (कुख्यात '... ') पर केंद्रित है और ओपी पहले से ही सामान्य मामले में तर्क देखने के बारे में जानता है। –

+1

एक भिन्न कार्य को पारित तर्कों को देखने का सबसे आसान तरीका कॉल स्टैक में एक स्तर तक जाना है। यह एक साधारण समाधान है; विविधतापूर्ण कार्य के भीतर से ऐसा करने की कोशिश करने से परेशान क्यों? –

+0

सही, मुझे लगता है कि बहुत स्पष्ट है, इसके बारे में भी सोचा नहीं था। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^