سؤال

ويمكن لأحد أن يقول لي كيف نفعل وقت التصحيح على المكتبات المشتركة؟

وأحتاج إلى وقت-تصحيح وظيفة في مكتبة مشتركة بلدي، لكنه دعا من قبل برنامج آخر. كيف يمكن أن أفعل شيئا مثل DBX مع المكتبات المشتركة؟

وأنا م باستخدام DBX على AIX. غير جدب أفضل من DBX لماذا أنا م تحاول أن تفعل؟.

هل كانت مفيدة؟

المحلول

وتحتاج فقط إلى الاتصال جدب مع تنفيذ (لا يهم إذا كان لك أو 3rd الطرف واحد). هنا مثال حيث I تصحيح <م> ليرة سورية الأمر وتعيين نقطة توقف في مكتبة ج (مشتركة) . يستخدم هذا المثال جدب 6.8 الذي يدعم المؤجلة (انتظار) نقاط مما يجعل هذا سهل:

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)

وكما ترون جدب تدير تلقائيا فقط عن المواضيع التي تستخدمها للتنفيذ. لم يكن لديك لتفعل أي شيء خاص للمواضيع هناك. سوف توقف العمل في أي موضوع.

وبدلا من ذلك إذا كنت ترغب في إرفاق المصحح إلى تطبيق قيد التشغيل بالفعل (أنا استخدم ذيل -f / تمة / 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)

نصائح أخرى

وعادة إجراءات التصحيح مكتبة المشترك هو إلى حد كبير نفس من أجل التصحيح للتنفيذ - والفرق الرئيسي هو أنك قد لا تتمكن من تعيين نقطة توقف حتى يتم تحميل مكتبة مشتركة إلى الذاكرة. إرفاق المصحح إلى الملف التنفيذي الرئيسي.

إذا كنت تصحيح التطبيق الذي لا تملكه أنت، ولكن باستخدام وحدة بك في بنية البرنامج المساعد، وكنت لا تزال تستخدم نفس الأسلوب. تأكد (كما هو الحال دائما) التي قمت تصحيح المعلومات المتوفرة لمكتبتك المشتركة. في ويندوز، سوف يمكنك إنشاء الملف .pdb. مع دول مجلس التعاون الخليجي، وأعتقد أن قمت بتحديد العلم مترجم خاص (-G؟) للتأكد من أن معلومات التصحيح يتم توفيره. إرفاق المصحح إلى تطبيق طرف ثالث.

وثمة مثال آخر أيضا على إجابة لوثر في:

وأنا على التوالي اختبارات على test.so ديناميكية مكتبة (المترجمة من test.c) في لينكس باستخدام python وunittest مكتبة اختبار وحدة الثعبان ودعا tests/test_pwmbasic.py. (نظام تسمية هو رتيبة بعض الشيء، وأنا أدرك ذلك الآن)

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

وأريد أن تصحيح ما في test.so من التحفيز في test_pwmbasic.py. لذلك هذا هو كيف حصلت على عمل ...

$ 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

والآن أريد أن أتزوج جدب

ملاحظة: يتضمن test.c أيضا ../pwm.c، لذلك يمكنني أيضا أن توقف في تلك المكتبة مع

(gdb) b pwm.c:123

وأتذكر اختبار المكتبات المشتركة عن طريق إنشاء التطبيق وهمية أن استخدامها. إذا كنت على استعداد للقيام الكثير من العمل، يمكنك إنشاء الثانية، مكتبة مشتركة وهمية الذي يجمع فقط المعلومات حول كيفية استخدام المكتبة من قبل التطبيق طرف ثالث، ومن ثم يكون لديك وهمية التطبيق إعادة تلك المعلومات.

وبطبيعة الحال، لا شك في قوة المكالمات printf وfprintf في وضع جيد.

لقد مضى وقت طويل منذ اضطررت لاستخدام DBX على AIX، وأنا واجهت هذه المشكلة أيضا. تركيب وجدب ليس خيارا بالنسبة لي.

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

هل يمكن أن تحاول تجميع وربط المكتبة بشكل ثابت لتصحيح ذلك.
إذا الشوائب يظهر فقط حتى عندما يكون جمعت أنها المشتركة، من ذلك قد تعطيك بعض القرائن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top