مرتبك بين gdb print ptr وprint "%s"
-
09-06-2019 - |
سؤال
1167 ptr = (void*)getcwd(cwd, MAX_PATH_LENGTH-1);
(gdb) n
1168 if (!ptr) {
(gdb) print ptr
$1 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa"
(gdb) print &cwd
$2 = (char (*)[3500]) 0xbff2d96c
(gdb) print strlen(cwd)
$3 = 36
(gdb) print "%s",cwd
$4 = "/media/MMC-SD/partition1/aaaaaaaaaaa", '\0' <repeats 912 times>, "��O�001\000\000\000\000��027\000\000\000�3����EL鷠3�000��027\000\000\000\000\000\000\000\027\000\000\000\000��/�027\000\000\000�3����N����\230���鷠3�000��027\000\000\000\000\000\000\000��000\000\000\000\001\000\000\000��M鷠3����\000\000\000\000.\231�027��w\005\b\001\000"...
(gdb) print "%s", ptr
$5 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa"
(gdb) Quit
لماذا يقوم ptr بطباعة السلسلة بشكل صحيح ولكن لا يقوم cwd بذلك؛يؤثر هذا أيضًا على البرنامج ويتعطل إذا حاولت استخدام cwd...
[يحرر:تبين أن العطل كان بسبب تجاوز سعة المخزن المؤقت الغبي في هذا المتغير ...grr...وليس gdb، لكن سؤال الطباعة لا يزال صالحًا]
المحلول
السبب في أن cwd
تتم طباعته بشكل مختلف في gdb
لأن gdb
يعرف أن ptr
هو char *
(على ما أظن) وذلك cwd
هي مجموعة من الطول 3500
(كما هو موضح في الإخراج الخاص بك).لذلك عند الطباعة ptr
يقوم بطباعة قيمة المؤشر (وكخدمة أيضًا السلسلة التي يشير إليها) وعند الطباعة cwd
يقوم بطباعة جميع مجموعة مصفوفة.
لا أرى أي سبب لاستخدام cwd
بدلاً من ptr
قد يؤدي إلى مشاكل، ولكنني سأحتاج إلى رؤية بعض التعليمات البرمجية للتأكد.
نصائح أخرى
وأنا أتفق مع مويردن.عند تجربة شيء أعتقد أنه مشابه لشفرتك، أحصل على:
(gdb) print cwd
$1 = "/media", '\0' <repeats 782 times>, "\016���" ...
(gdb) print (char*) cwd
$2 = 0xbfc8eb84 "/media"
من gdb، لذلك يبدو أنه منذ ذلك الحين cwd
تم تعريفه على أنه char cwd[3500]
, ، يقوم gdb بطباعة المصفوفة بأكملها، بينما إذا طلبت من gdb أن يفسرها على أنها a char*
, ، وسوف تعمل كما كنت تتوقع.إذا تعطل تطبيقك، فسأفترض أن السبب هو شيء آخر.
الذي - التي ptr
يتم عرضها كسلسلة منسقة بشكل جيد و cwd
لأن "المخزن المؤقت للبايت" ربما يكون خاصًا بـ gdb.في أي حال، لا ينبغي أن يؤثر ذلك على طلبك؛وفق man 3 getcwd
, ptr
يجب أن أشير إلى cwd
(أو يجب أن تكون فارغة في حالة حدوث خطأ).هل تستطيع استعمال ptr
دون تعطل البرنامج؟
ما هو نوع سي دي؟مقتطف الكود أعلاه لا يخبرنا بذلك.من الممكن أن يتم التعامل مع كون ptr فارغًا* بشكل مختلف بواسطة gdb.