2012-06-21 12 views
11

स्ट्रेस के साथ कुछ फ़ाइल डिस्क्रिप्टर के लिए ioctl कॉल और कुछ कमांड के साथ देखना संभव है। तीसरा तर्क एक संरचना है, लेकिन स्ट्रेस इसे स्मृति के लिए कच्चे सूचक के रूप में दिखाता है। strace उत्पादन उदाहरण:स्ट्रेस आउटपुट का व्याख्यान

open("/dev/node", O_RDWR) = 3 
ioctl(3, 0x108, 0x8f0eb18) = 0 
close(3) 

वहाँ एक रास्ता (strace विकल्प या अन्य उपकरण) संरचना, या एक कच्चे सूचक के पीछे कम से कम एक मूल्य है कि क्या देखने के लिए है?

+0

यह आप का पता दे करता है अनुदेश? यदि ऐसा है तो यह ब्रेक पॉइंट जोड़ने के लिए जीडीबी में वास्तव में सरल है और फिर स्मृति को देखें ... आप वास्तविक संरचना को कैसे निर्धारित करेंगे, मैं इतना निश्चित नहीं हूं। – Matt

+0

मेरा मतलब है कि अगर मैं इसे अपने प्रोग्राम में लिखूंगा, तो यह इस तरह दिखेगा: 'ioctl (dev_node, IOCTL_CODE, और ioctl_struct) ', जहां तीसरा तर्क टाइप Ioctl_Buf_Struct की संरचना है। जब बाइनरी प्रोग्राम के लिए स्ट्रेस का उपयोग किया जाता है जैसा कि हम ऊपर दिए गए उदाहरण में देखते हैं, तो मुझे यह जानकर उत्सुकता होगी कि 0x8f0eb18 पता के पीछे क्या है: वहां क्या संरचना है, या कम से कम इसका मूल्य क्या है। जीडीबी यहाँ मदद कर सकते हैं? –

+0

अच्छी तरह से ... यदि आप प्रोग्राम चलाते हैं, तो उस आदेश से ठीक पहले रुकें, तो आप पॉइंटर को डिफ्रेंस करके मान पा सकते हैं। सभी मॉलोक कॉल खोजने के लिए स्ट्रेस का उपयोग करें, जब तक कि आप उस पॉइंटर को वापस नहीं लौटाते। यह आपको संरचना का आकार बताएगा।फिर आप ज्ञात आकार के साथ स्मृति को देख सकते हैं, और इसलिए इसके बाइनरी रूप में संरचना को पुन: उत्पन्न कर सकते हैं। आप कभी नहीं जानते कि * क्या * संरचना है, लेकिन आप मान पा सकते हैं। – Matt

उत्तर

2

gdb में, अगर आप इसे सही ioctl के लिए कॉल करने से पहले बंद करो, तुम तो दर्ज कर सकते हैं:

(gdb) p *(ioctl_struct *) 0x8f0eb18 

कि आपको बताएंगे कि कैसे ioctl_struct है कि स्मृति स्थान नक्शे की सामग्री।

1

मैं एक ऐसी ही समस्या हुई:, vde_switch (जो एक TUN/नल आभासी नेटवर्क इंटरफेस बनाता है) द्वारा किए गए ioctl करने के लिए एक syscall का निरीक्षण करने के क्रम में पता करने के लिए मैं अपने कोड में गलत क्या कर रहा था में चाहता था (था जो vde_switch, लेकिन प्रोग्राम के रूप में के रूप में एक ही बात करने के लिए)

चल द्वारा:।

sudo strace vde_switch -tap tap0 

मुझे पता करने में सक्षम था, टेरी Greentail के रूप में, कि syscall बनाया जा रहा है ioctl(5, TUNSETIFF, 0x7fffa99404e0) था और सूचक एक संदर्भ होगा struct ifreq प्रकार की संरचना के लिए। मेरे कोड में मेरे पास ioctl(tapfd, TUNSETIFF, &ifr_dev) जैसा कुछ था।

शुरू में मैं स्थापित करने के लिए एक syscall पर gdb बंद करने की कोशिश की,: catch syscall ioctl (मैं gdb --args vde_switch -tap tap0 रूप gdb समाप्त हो चुकी थी), लेकिन जब भी पकड़ टक्कर मार दी थी, gdb ioctl के मापदंडों के बारे में कोई जानकारी नहीं पता चला है।

gdb --args strace vde_witch -tap -tap0 

हालांकि कोई ब्रेकप्वाइंट इस तरह से काम किया था, उत्पादन से पता चला है जो फ़ाइल वर्णनकर्ता किया जा रहा था: थोड़ी देर के लिए इस के साथ संघर्ष कर के बाद, मैं gdb के अंदर strace चलाने का फैसला किया, के रूप में

open("/dev/net/tun", O_RDWR)   = 9 
ioctl(9, TUNSETIFF, 0x7fffffffe350)  = 0 

तो मैं के साथ एक और समय की कोशिश की: gdb --args strace vde_witch -tap -tap0 और एक सशर्त ब्रेकप्वाइंट सेट:

b ioctl if $rdi==9 

बुला सम्मेलन (मैं एक AMD64 पर हूँ) का उपयोग करता RDI च या पहले पैरामीटर, दूसरे के लिए RSI और तीसरे के लिए RDX (System V AMD64 ABI देखें।) अंत में, जब ब्रेकप्वाइंट टक्कर मार दी थी, मैं ifreq संरचना का निरीक्षण करने में सक्षम था:

Breakpoint 6, ioctl() at ../sysdeps/unix/syscall-template.S:81 
81  ../sysdeps/unix/syscall-template.S: File or directory not found. 

(gdb) p (struct ifreq) *$rdx 
$5 = {ifr_ifrn = {ifrn_name = "tap0", '\000' <repete 11 vezes>}, ifr_ifru = {ifru_addr = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_dstaddr = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_broadaddr = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_netmask = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_hwaddr = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_flags = 4098, ifru_ivalue = 4098, ifru_mtu = 4098, ifru_map = {mem_start = 4098, mem_end = 0, base_addr = 0, irq = 0 '\000', dma = 0 '\000', port = 0 '\000'}, ifru_slave = "\002\020", '\000' <repete 13 vezes>, ifru_newname = "\002\020", '\000' <repete 13 vezes>, ifru_data = 0x1002 <Address 0x1002 out of bounds>}} 
संबंधित मुद्दे