ฉันจะตั้งค่าเบรกพอยต์แบบมีเงื่อนไขใน gdb ได้อย่างไรเมื่อ char * x ชี้ไปยังสตริงที่มีค่าเท่ากับ "hello"


164

ฉันสามารถระบุว่าฉันต้องการให้ gdb แตกที่บรรทัด x เมื่อchar* xชี้ไปที่สตริงที่มีค่าเท่ากับ"hello"หรือไม่ ถ้าใช่เป็นอย่างไร


หมายเหตุ: strncmpและstrstrเป็นฟังก์ชันการสืบค้น C ที่มีประโยชน์อื่น ๆ
Ciro Santilli 郝海东冠状病六四事件法轮功

คำตอบ:


198

คุณสามารถใช้strcmp:

break x:20 if strcmp(y, "hello") == 0

20คือหมายเลขบรรทัดxสามารถเป็นชื่อไฟล์ใดก็ได้และyสามารถเป็นตัวแปรใด ๆ


9
หมายเหตุ: คุณต้องรันโปรแกรมอยู่แล้วเพื่อที่ GDB จะเห็น stdlib มิฉะนั้น:No symbol "strcmp" in current context.
Ciro Santilli 郝海东冠状病六四事件法轮功

1
@CiroSantilli 六四事件法轮功包卓轩: วิธีการกำหนดค่า gdb เพื่อดู stdlib?
naive231

@ naive231 โดย "ดู" ฉันหมายถึงดูฟังก์ชั่นเพื่อให้คุณสามารถทำลายพวกเขาไม่ใช่แหล่งที่มา: คุณต้องกดปุ่มrunเพื่อที่จะได้โหลดไลบรารีแบบไดนามิก สำหรับแหล่งข้อมูล, google it และ find: stackoverflow.com/questions/10000335/… :-)
Ciro Santilli 郝海东冠状病病六四事件法轮功

1
วิธีนี้สามารถมีผลข้างเคียง $_streqวิธีการจาก @tlwhitec ดีกว่า
rools

55
break x if ((int)strcmp(y, "hello")) == 0

ในการใช้งานบางอย่าง gdb อาจไม่ทราบชนิดที่คืนค่าของ strcmp นั่นหมายความว่าคุณจะต้องโยนมิฉะนั้นมันจะประเมินเป็นจริงเสมอ!


46

ตั้งแต่ 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ซึ่งสนับสนุนไวยากรณ์นิพจน์หลามปกติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.