2009-04-29 11 views
32

क्या कोई मुझे बता सकता है कि साझा पुस्तकालयों पर रनटाइम डीबगिंग कैसे करें?साझा पुस्तकालयों को कैसे चलाया जा सकता है?

मुझे अपनी साझा लाइब्रेरी में एक फ़ंक्शन रनटाइम-डीबग करने की आवश्यकता है, लेकिन इसे किसी अन्य प्रोग्राम द्वारा बुलाया जाता है। मैं साझा पुस्तकालयों के साथ डीबीएक्स की तरह कुछ कैसे कर सकता हूं?

मैं एईक्स पर डीबीएक्स का उपयोग कर रहा हूं। क्या मैं कोशिश कर रहा हूं कि डीबीएक्स से बेहतर जीडीबी है?

उत्तर

28

आपको केवल निष्पादन योग्य के साथ जीडीबी कॉल करने की आवश्यकता है (इससे कोई फर्क नहीं पड़ता कि यह आपका है या कोई तृतीय पक्ष एक है)। यहां एक उदाहरण दिया गया है जहां मैंने ls कमांड डीबग किया है और (साझा) सी लाइब्रेरी में ब्रेकपॉइंट सेट किया है।

gdb /bin/ls 
GNU gdb 6.8-debian 
Copyright (C) 2008 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 "x86_64-linux-gnu"... 
(no debugging symbols found) 
(gdb) b write 
Function "write" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 
Breakpoint 1 (write) pending. 
(gdb) r 
Starting program: /bin/ls 
(no debugging symbols found) 
(no debugging symbols found) 
(no debugging symbols found) 
(no debugging symbols found) 
(no debugging symbols found) 
(no debugging symbols found) 
(no debugging symbols found) 
[Thread debugging using libthread_db enabled] 
(no debugging symbols found) 
(no debugging symbols found) 
[New Thread 0x7f98d2d23780 (LWP 7029)] 
[Switching to Thread 0x7f98d2d23780 (LWP 7029)] 

Breakpoint 1, 0x00007f98d2264bb0 in write() from /lib/libc.so.6 
(gdb) 

आप gdb देख सकते हैं स्वचालित रूप से सभी धागे निष्पादन द्वारा प्रयोग किया जाता का प्रबंधन करता है: इस उदाहरण gdb 6.8 जो आस्थगित समर्थन करता है (लंबित) breakpoints जो इस आसान बना देता है का उपयोग करता है। आपको धागे के लिए कुछ खास करने की ज़रूरत नहीं है। ब्रेकपॉइंट किसी भी धागे में काम करेगा।

वैकल्पिक रूप से यदि आप एक पहले से ही चल रहे ऐप्लिकेशन को डिबगर अनुलग्न करना चाहते हैं (मैं का उपयोग पूंछ -f/tmp/TTT यहाँ एक उदाहरण के रूप में):

ps ux | grep tail 
lothar 8496 0.0 0.0 9352 804 pts/3 S+ 12:38 0:00 tail -f /tmp/ttt 
lothar 8510 0.0 0.0 5164 840 pts/4 S+ 12:39 0:00 grep tail 

gdb 
GNU gdb 6.8-debian 
Copyright (C) 2008 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 "x86_64-linux-gnu"... 
(no debugging symbols found) 
(gdb) attach 8496 
Attaching to program: /usr/bin/tail, process 8496 
Reading symbols from /lib/librt.so.1...(no debugging symbols found)...done. 
Loaded symbols for /lib/librt.so.1 
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done. 
Loaded symbols for /lib/libc.so.6 
Reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done. 
[Thread debugging using libthread_db enabled] 
[New Thread 0x7f24853f56e0 (LWP 8496)] 
Loaded symbols for /lib/libpthread.so.0 
Reading symbols from /lib/ld-linux-x86-64.so.2... 
(no debugging symbols found)...done. 
Loaded symbols for /lib64/ld-linux-x86-64.so.2 
(no debugging symbols found) 
0x00007f2484d2bb50 in nanosleep() from /lib/libc.so.6 
(gdb) b write 
Breakpoint 1 at 0x7f2484d57bb0 
(gdb) c 
Continuing. 
[Switching to Thread 0x7f24853f56e0 (LWP 8496)] 

Breakpoint 1, 0x00007f2484d57bb0 in write() from /lib/libc.so.6 
(gdb) 
+0

I एईक्स पर इस्तेमाल डीबीएक्स। यदि आप कहते हैं कि जीडीबी इसे थ्रेडेड अनुप्रयोगों के साथ कर सकता है .. तो डीबीएक्स बड़ा समय बेकार है..और मैं इस बार इसका इस्तेमाल करने के लिए कुल मूर्ख रहा हूं। –

+0

दुखद gdb AIX पर ठीक से काम नहीं करता है ... AIX बेकार है .. –

+0

मुझे डीबीएक्स नहीं पता है, लेकिन इसमें समान विशेषताएं होनी चाहिए – lothar

9

आम तौर पर साझा लाइब्रेरी को डीबग करने की प्रक्रिया निष्पादन योग्य डीबगिंग के समान ही होती है - मुख्य अंतर यह है कि जब तक साझा लाइब्रेरी को स्मृति में लोड नहीं किया जाता है तब तक आप ब्रेकपॉइंट सेट करने में असमर्थ हो सकते हैं। आप डीबगर को मुख्य निष्पादन योग्य में संलग्न करते हैं।

यदि आप किसी ऐसे एप्लिकेशन को डिबग कर रहे हैं जो आपके स्वामित्व में नहीं है, लेकिन प्लगइन आर्किटेक्चर में आपके मॉड्यूल का उपयोग कर रहा है, तो भी आप एक ही विधि का उपयोग करते हैं। सुनिश्चित करें (हमेशा के रूप में) कि आपके पास अपनी साझा लाइब्रेरी के लिए डिबगिंग जानकारी उपलब्ध है। विंडोज़ में, आप एक .pdb फ़ाइल जेनरेट करेंगे। जीसीसी के साथ, मुझे लगता है कि डीबगिंग जानकारी प्रदान की जाती है यह सुनिश्चित करने के लिए कि आप एक विशेष कंपाइलर ध्वज (-g?) निर्दिष्ट करते हैं। आप डीबगर को तीसरे पक्ष के आवेदन में संलग्न करते हैं।

+0

क्या होगा यदि मुख्य निष्पादन योग्य मेरा नहीं है और इसकी कुछ तीसरी पार्टी है .... लेकिन मैं एक मॉड्यूल लिख रहा हूं जिसका उपयोग तीसरे पक्ष द्वारा किया जाएगा ... फिर आप डीबग कैसे करते हैं? –

+0

आप अभी भी gdb के साथ निष्पादन योग्य (या प्रक्रिया से संलग्न) शुरू करते हैं। आपकी लाइब्रेरी लोड होने के बाद जीडीबी समस्या के बिना ब्रेकपॉइंट्स सेट कर सकता है। – lothar

+0

लेकिन जब आप अपने साझा lib कोड में ब्रेक पॉइंट सेट करते हैं और यदि मुख्य निष्पादन योग्य इसे कॉल करता है, तो मुख्य निष्पादन योग्य अवरुद्ध नहीं होगा ?? –

1

मुझे लगता है कि एक मॉक ऐप बनाकर साझा पुस्तकालयों का परीक्षण करना याद है। यदि आप बहुत सारे काम करने के इच्छुक हैं, तो आप एक दूसरी, नकली साझा लाइब्रेरी बना सकते हैं जो कि तृतीय पक्ष ऐप द्वारा लाइब्रेरी का उपयोग कैसे किया जा रहा है, इसके बारे में जानकारी एकत्र करता है, और उसके बाद आपका नकली ऐप उस जानकारी को फिर से चलाता है।

बेशक, अच्छी तरह से संरक्षित printf और fprintf कॉल की शक्ति पर कभी संदेह न करें।

0

आप इसे डीबग करने के लिए लाइब्रेरी को संकलित और लिंक करने का प्रयास कर सकते हैं।
यदि आपका बग केवल साझा होने पर संकलित होता है, तो इससे आपको कुछ संकेत मिल सकते हैं।

1

इसके बाद से मैं एक लंबे समय दिया गया है एईक्स पर डीबीएक्स का उपयोग करना पड़ा, और मुझे भी इस समस्या का सामना करना पड़ा। जीडीबी स्थापित करना मेरे लिए एक विकल्प नहीं था।

dbx /path/to/your/program 
(dbx) run [args to your program] 
(dbx) set $ignoreonbptrap   # I kept hitting a trace/bpt trap 
(dbx) set $deferevents    # allows setting bp in not loaded shared library 
(dbx) set $repeat     # useful, repeat commands with <enter> tjust like gdb 
(dbx) stop in MySharedLibraryFunc # defers breakpoint 
(dbx) cont 
3

लोथर के जवाब देने के लिए एक और उदाहरण है आगे:

मैं एक गतिशील पुस्तकालय test.so पर परीक्षण चल रहा हूँ (test.c से संकलित) लिनक्स में python और अजगर की इकाई परीक्षण पुस्तकालय unittesttests/test_pwmbasic.py कहा जाता है का उपयोग कर।(नामकरण योजना थोड़ा नीरस है, मुझे लगता है कि अब)

~/my/test/path/ 
    tests/ 
     __init__.py 
     test_pwmbasic.py 
    test.c 
    test.so 

मैं test_pwmbasic.py में प्रोत्साहन से test.so में क्या है डिबग करने के लिए चाहते हैं। तो यह है कि कैसे मैं यह काम कर रहा ...

$ cd ~/my/test/path 
$ gdb $(which python) 
    ... gdb blah ... 
(gdb) b test.c:179 
(gdb) run 
>>> from tests.test_pwmbasic import * 
>>> import unittest 
>>> unittest.main() 
    ... unittest blah ... 
Breakpoint 1, pwmTest_setDutyCycles (dutyCycles=0x7ffff7ece910) at ./test.c:179 
(gdb) print pwm_errorCode 
$1 = PWM_ERROR_NONE 

और अब मैं gdb शादी करनी है मिल गया है

ध्यान दें: test.c भी ../pwm.c शामिल हैं, इसलिए मैं भी

(gdb) b pwm.c:123 
साथ कि पुस्तकालय के भीतर ब्रेकपाइंट कर सकते हैं
संबंधित मुद्दे