摘要: 实际上,GDB 没有对多进程程序调试提供直接支持。例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去。如果你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号并终止。那么该如何调试子进程呢?其实我们可以利用GDB的特点或者其他一些辅助手段来达到目的。此外,GDB 也在较新内核上加入一些多进程调试支持。本文介绍的方法能让你把断点设在子进程中,单步查看子进程的运行情况。但问题,如果我想在一次调试中同时在父子进程中设置断点,单步执行该怎么做呢? 1 #include<stdio.h> 2 #include<stri 阅读全文
posted @ 2012-01-09 21:08 高性能golang 阅读(4452) 评论(0) 推荐(0) 编辑
摘要: 首先明确一下,同一个文件在同一个进程中可以被打开多次,只是返回的文件描述符不同。read、write、lseek都涉及到文件指针,文件指针是跟文件描述符关联在一起,跟物理文件是分开的。每个文件描述符都有3个指针:begin、curr、end。可以有两种方法更改curr指针:每次write或read的末位置就是curr指针的位置;使用lseek(int fd,int offset,int whence)。每次read都从curr位置开始,每次write都从begin位置开始。看一段程序: 1 #include<stdio.h> 2 #include<string.h> 3 阅读全文
posted @ 2012-01-09 20:22 高性能golang 阅读(2625) 评论(0) 推荐(0) 编辑
摘要: 如果你对代码段、数据段、栈、堆存放哪些数据还不是很清楚,请先看我写和Linux 内存管理。有时会出现父子进程变量的地址一样,但值不一样。看下面代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<unistd.h>main(){ char str[4]="asd"; pid_t pid=fork(); if(pid==0){ str[0]='b'; printf("子进程中str=%s\n",str); printf 阅读全文
posted @ 2012-01-09 18:34 高性能golang 阅读(15710) 评论(5) 推荐(7) 编辑