ฉันสามารถระบุว่าฉันต้องการให้ 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 ที่มีประโยชน์อื่น ๆ