<span style="font-family: Arial, Helvetica, sans-serif;">#include<iostream></span>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
using namespace std;
typedef void (*PROCESS)(void *pContext);
pid_t CreateProcess(PROCESS child, void *pContext)
{
pid_t pid = fork();
if(0 == pid)
{
sleep(60);
child(pContext);
exit(0);
}
else
{
return pid;
}
}
void MyChild(void *pContext)
{
int i = (int)pContext;
cout << "In child: " << i << endl;
}
int main()
{
int i = 90;
CreateProcess(MyChild, (void *)i);
cout << "In Father" << endl;
return 0;
}
如何进行对上面程序使用gdb进行调试呢???
首先熟悉下gdb的相关指令:
§进入gdb
Ø使用-g选项编译,加入调试信息
Ø#gdb 要调试的可执行文件名
§查看当前文件
Ø>list
Ø>list文件名:行号
§设置断点
Ø>break行号
§清除断点
Ø>clear行号
§运行调试
Ø>run
Ø>continue
§查看变量值
Ø>display表达式
§监控表达式的值
Ø>watch表达式
§执行下一语句
Ø>step
Ø>next
§查看汇编代码
Ø>disass
§查看寄存器
Ø>inforegisters
§查看内存区域
Ø>x/10xb 地址/产生地址的表达式
Ø以16进制查看大小为10字节的内存区域
下面讲解具体的对上面的例子程序使用gdb进行调试:
首先:
1.编译并生成带调试参数的可执行文件:
gcc -g test.cpp -o test
使用ls指令可以看到生成了可执行的 test文件
2.启动gdb(多开一个终端,以监控进程)
gdb test
3. 设置断点在main函数和在fork子进程处
4. 在新打开的窗口处通过 ps -ef 查看 子进程和父进程的PID
5. attach + pid 得到jinc
6.stop 后 ,使用断点等就可以进行分析了
总的来说,这种方法在进程多的时候容易乱了,很不方面
具体的多进程使用GDB调试,还请参考: