//默认
cat /var/log/syslog
./thttpd -C /home/share/thttpd-2.27/www/thttpd.conf
http://192.168.1.185:2810/index.cgi?ch=1
gdb多进程调试
set args -C /home/share/thttpd-2.27/www/thttpd.conf
show detach-on-fork
catch fork
break libhttpd.c:3547
r 先打断点,再运行
//显示进程
//切换到子进程
info inferiors
inferior (pid)
//子线程
//切换到子线程
info threads
thread 3
//gdb运行脚本
gdb ./thttpd -command=gdb.sh
set follow-fork-mode <parent/child>
这条命令可以用于在调试父进程或是子进程的模式之间进行切换。
例如在fork函数执行之前执行set follow-fork-mode child, 当fork执行后
,设定在子进程上的断点将会有效,而父进程上的断点此时无效;
反之依然。缺省gdb是调试主进程的。
/===============================================
//gdb.sh
file thttpd
set args -C /home/share/web/bin/thttpd.conf
set detach-on-fork off
show detach-on-fork
b libhttpd.c:3387
catch fork
//================
//thttpd.conf
port=2810
host=192.168.1.185
logfile=/home/share/web/thttpd.log
urlpat=*.txt|*.mp3|*.html|*.cgi
dir=/home/share/web/www/pages/
cgipat=*.cgi
GDB多线程调试的基本命令:
info threads 查看当前进程的线程。
thread <ID> 切换调试的线程为指定ID的线程。
break [LOCATION] [thread THREADNUM] [if CONDITION] 在[LOCATION]处为[thread THREADNUM]设置断点在满足条件[if CONDITION]时停住 。
thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command。
thread apply all command 让所有被调试线程执行GDB命令command。
set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
off 不锁定任何线程,也就是所有线程都执行,这是默认值。
on 只有当前被调试程序会执行。
step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。