ฉันสามารถระบุว่าฉันต้องการให้ gdb แตกที่บรรทัด x เมื่อchar* xชี้ไปที่สตริงที่มีค่าเท่ากับ"hello"หรือไม่ ถ้าใช่เป็นอย่างไร
ฉันสามารถระบุว่าฉันต้องการให้ gdb แตกที่บรรทัด x เมื่อchar* xชี้ไปที่สตริงที่มีค่าเท่ากับ"hello"หรือไม่ ถ้าใช่เป็นอย่างไร
คำตอบ:
คุณสามารถใช้strcmp:
break x:20 if strcmp(y, "hello") == 0
20คือหมายเลขบรรทัดxสามารถเป็นชื่อไฟล์ใดก็ได้และyสามารถเป็นตัวแปรใด ๆ
No symbol "strcmp" in current context.
runเพื่อที่จะได้โหลดไลบรารีแบบไดนามิก สำหรับแหล่งข้อมูล, google it และ find: stackoverflow.com/questions/10000335/… :-)
$_streqวิธีการจาก @tlwhitec ดีกว่า
break x if ((int)strcmp(y, "hello")) == 0
ในการใช้งานบางอย่าง gdb อาจไม่ทราบชนิดที่คืนค่าของ strcmp นั่นหมายความว่าคุณจะต้องโยนมิฉะนั้นมันจะประเมินเป็นจริงเสมอ!
ตั้งแต่ GDB 7.5คุณสามารถใช้ฟังก์ชั่นอำนวยความสะดวกพื้นฐานเหล่านี้:
$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)
ดูเหมือนว่าจะมีปัญหาน้อยกว่าการเรียกใช้ "foreign" strcmp()บนสแต็กของกระบวนการทุกครั้งที่กดเบรกพอยต์ นี่เป็นจริงโดยเฉพาะอย่างยิ่งสำหรับการดีบักกระบวนการแบบมัลติเธรด
โปรดทราบว่า GDB ของคุณจะต้องรวบรวมด้วยการสนับสนุน Python ซึ่งไม่ใช่ปัญหาของ linux distros ปัจจุบัน เพื่อให้แน่ใจว่าคุณสามารถตรวจสอบได้โดยการทำงาน
show configurationภายใน GDB--with-pythonและค้นหา ผู้ประกอบการรายเล็กน้อยรายนี้ทำเคล็ดลับเช่นกัน:$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' --with-python=/usr (relocatable)
สำหรับกรณีตัวอย่างของคุณการใช้งานจะเป็น
break <where> if $_streq(x, "hello")
หรือถ้าเบรกพอยต์ของคุณมีอยู่แล้วและคุณต้องการเพิ่มเงื่อนไขลงไป
condition <breakpoint number> $_streq(x, "hello")
$_streqเพียงตรงกับสตริงทั้งหมดดังนั้นหากคุณต้องการบางสิ่งบางอย่างมากขึ้นไหวพริบคุณควรใช้$_regexซึ่งสนับสนุนไวยากรณ์นิพจน์หลามปกติ
strncmpและstrstrเป็นฟังก์ชันการสืบค้น C ที่มีประโยชน์อื่น ๆ