سؤال

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.

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