كيف يمكنني طباعة القيمة الكاملة لسلسلة طويلة في gdb؟

StackOverflow https://stackoverflow.com/questions/233328

سؤال

أريد طباعة الطول الكامل لسلسلة C في GDB.بشكل افتراضي يتم اختصاره، كيف يمكنني إجبار GDB على طباعة السلسلة بأكملها؟

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

المحلول

set print elements 0

من دليل GDB:

set print elements number-of-elements
قم بتعيين حد لعدد عناصر المصفوفة التي سيطبعها GDB.إذا كان GDB يطبع مصفوفة كبيرة، فإنه يتوقف عن الطباعة بعد أن يطبع عدد العناصر التي حددها set print elements يأمر.ينطبق هذا الحد أيضًا على عرض السلاسل.عند بدء تشغيل GDB، يتم تعيين هذا الحد على 200. جلسة عدد العناصر إلى الصفر يعني أن الطباعة غير محدودة.

نصائح أخرى

وطالما برنامج الخاص بك في حالة سليمة، يمكنك أيضا call (void)puts(your_string) طباعته إلى المعياري. وينطبق نفس المبدأ على جميع الوظائف المتاحة إلى المصحح، في الواقع.

وهناك خيار ثالث: الأمر العاشر، والذي يسمح لك لوضع حد مختلف لأمر معين بدلا من تغيير إعداد عمومي. لطباعة الأحرف 300 الأولى من سلسلة يمكنك استخدام x/300s your_string. قد يكون الإخراج أصعب قليلا لقراءة. على سبيل المثال طباعة نتائج الاستعلام SQL في:

(gdb) x/300sb stmt.c_str()
0x9cd948:    "SELECT article.r"...
0x9cd958:    "owid FROM articl"...
..

والأمر printf سيتم طباعة سلاسل كاملة:

(gdb) printf "%s\n", string

وفقط لاستكمال ما يلي:

(gdb) p (char[10]) *($ebx)
$87 =   "asdfasdfe\n"

ويجب إعطاء طول، ولكن قد تتغير تمثيل هذه السلسلة:

(gdb) p/x (char[10]) *($ebx)
$90 =   {0x61,
  0x73,
  0x64,
  0x66,
  0x61,
  0x73,
  0x64,
  0x66,
  0x65,
  0xa}

وهذا قد يكون مفيدا إذا كنت ترغب في تصحيح على أساس قيمهم

استخدام set elements ... ليست دائما أفضل طريقة.سيكون من المفيد لو كان هناك متميزة set string-elements ....

لذلك، أستخدم هذه الوظائف في .gdbinit الخاص بي:

define pstr
  ptype $arg0._M_dataplus._M_p
  printf "[%d] = %s\n", $arg0._M_string_length, $arg0._M_dataplus._M_p
end

define pcstr
  ptype $arg0
  printf "[%d] = %s\n", strlen($arg0), $arg0
end

تحفظات:

  • الأول يعتمد على c++ lib لأنه يصل إلى أعضاء std::string، ولكن يمكن تعديله بسهولة.
  • لا يمكن استخدام الثاني إلا على برنامج قيد التشغيل كما يطلق عليه strlen.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top