【LINUX】 GDB 再次学习 线程相关

yum install  gdb
Downloading Packages:
gdb-7.2-90.el6.i686.rpm                                  | 2.3 MB     02:25     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : gdb-7.2-90.el6.i686                                          1/1 
  Verifying  : gdb-7.2-90.el6.i686                                          1/1 

Installed:
  gdb.i686 0:7.2-90.el6                                                         

Complete!

[email protected] 20160729]# cc -g 0.c -o 0
[[email protected] 20160729]# gdb 0

####################################################################
fun()
{
int i=0;
for(;i<10;i++)
  {
   printf("i = %d \n",i) ;
  }
}
int main()
{
fun();
return 0;
}

 
break  3
break  fun
r
n
c
p i                           printf  i
bt     <--------------------- 查看函数堆栈
finish <--------------------- 退出函数
q                            quit
######################################
g++ -o m *.cpp *.h -lpthread  文件见下方
(gdb) set detach-on-fork off
(gdb) show detach-on-fork
Whether gdb will detach the child of a fork is off.
(gdb) catch fork
Catchpoint 1 (fork)
(gdb) r
Starting program: /home/sts/Desktop/20160728/m 
[Thread debugging using libthread_db enabled]
[New Thread 0xb7feeb70 (LWP 11752)]
put:2
[New Thread 0xb75edb70 (LWP 11753)]
put:3
[New Thread 0xb6becb70 (LWP 11754)]
get:2
[New Thread 0xb61ebb70 (LWP 11755)]
get:0
put:5
put:7
get:0
get:0
put:9
put:11
get:0
get:2
put:3
put:5
get:0
get:0
put:7
put:9
get:0
get:0
put:11
put:3
get:2
get:0
put:5
put:7
get:0

(gdb) cont
Continuing.
put:11
put:3
get:2
get:0
put:5
put:7
get:0
get:0
^C
Program received signal SIGINT, Interrupt.
0x00110424 in __kernel_vsyscall ()
(gdb) info inferiors
  Num  Description       Executable        
* 1    process 11787     /home/sts/Desktop/20160728/m  
(gdb) inferior 1
[Switching to inferior 1 [process 11787] (/home/sts/Desktop/20160728/m)]
[Switching to thread 1 (Thread 0xb7ff06d0 (LWP 11787))] 
#0  0x00110424 in __kernel_vsyscall ()
(gdb) 

#include <stdio.h> 
#include <pthread.h>
#include <iostream>  
#include <unistd.h>    
using namespace std; 
/*  同步关系
多生产和多消费者三种关系
加代码

生产方面  位置共用
消费方面  位置共用
*/
int  ss[10];
int  i=1;
int  j=1;
void*s(void)
{     
    while(i++)
    {
    ss[i]=i;    cout<<"put:"<<ss[i]<<endl; 
    sleep(2);
   i=i%10+1;   
    }
}

void*x(void)
{           
    while(j++)
       {
  cout<<"get:"<<ss[j]<<endl;    j=j%10+1;   
    sleep(2);
    } 
}

int main(void) 
{  
    pthread_t ids1,ids2,idx1,idx2;    
     pthread_create(&ids1,NULL,(void* (*)(void*))s,NULL);
     pthread_create(&ids2,NULL,(void* (*)(void*))s,NULL);        
     pthread_create(&idx1,NULL,(void* (*)(void*))x,NULL);
     pthread_create(&idx2,NULL,(void* (*)(void*))x,NULL);        

    pthread_join(ids1,NULL);
    pthread_join(ids2,NULL);  
    pthread_join(idx1,NULL);
    pthread_join(idx2,NULL);
    return (0); 
}

//g++ -o m *.cpp *.h -lpthread

http://blog.csdn.net/pbymw8iwm/article/details/7876797

时间: 2024-08-03 19:09:16

【LINUX】 GDB 再次学习 线程相关的相关文章

linux网络编程学习笔记之五 -----并发机制与线程?

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.能够在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理须要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也非常easy,在主线程中定时,定

linux网络编程学习笔记之五 -----并发机制与线程池

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我只是举几个例子作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.可以在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理需要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也很简单,在主线程中定时,定时到期,

Linux System Programming 学习笔记(七) 线程

1. Threading is the creation and management of multiple units of execution within a single process 二进制文件是驻留在存储介质上,已被编译成操作系统可以使用,准备执行但没有正运行的休眠程序 进程是操作系统对 正在执行中的二进制文件的抽象:已加载的二进制.虚拟内存.内核资源 线程是进程内的执行单元 processes are running binaries, threads are the smal

PyQt5学习笔记15----PyQt 线程相关类

QThread是我们将要详细介绍的第一个类.它也是 Qt 线程类中最核心的底层类.由于 PyQt 的跨平台特性,QThread要隐藏掉所有平台相关的代码. 正如前面所说,要使用QThread开始一个线程,我们可以创建它的一个子类,然后覆盖其QThread.run()函数: class Thread(QThread): def __init__(self): super(Thread,self).__init__() def run(self): pass #线程相关代码 然后我们这样新建一个新的

Linux内存管理学习笔记——内存寻址

最近开始想稍微深入一点地学习Linux内核,主要参考内容是<深入理解Linux内核>和<深入理解Linux内核架构>以及源码,经验有限,只能分析出有限的内容,看完这遍以后再更深入学习吧. 1,内存地址 逻辑地址:包含在机器语言中用来指定一个操作数或一条指令的地址. 线性地址:一个32位无符号数,用于直接映射物理地址 物理地址:片上引脚寻址级别的地址 2,逻辑地址->线性地址 2.1 段选择符与段寄存器 逻辑地址:段选择符(16位)+段内偏移(32位) index:在GDT或L

linux内核数据结构学习总结(undone)

本文旨在整理内核和应用层分别涉及到的数据结构,从基础数据结构的角度来为内核研究作准备,会在今后的研究中不断补充 目录 1. 进程相关数据结构 1) struct task_struct 2. 内核中的队列/链表对象 3. 内核模块相关数据结构 2) struct module 1. 进程相关数据结构 0x1: task_struct 我们知道,在windows中使用PCB(进程控制块)来对进程的运行状态进行描述,对应的,在linux中使用task_struct结构体存储相关的进程信息,task_

(转)Linux基础知识学习

Linux基础知识学习 原文:http://blog.csdn.net/ye_wei_yang/article/details/52777499 一.Linux的磁盘分区及目录 Linux的配置是通过修改配置文件来完成. 1.1.Linux磁盘分区 Linux可以将磁盘分为多个分区,每个分区可以被当做一个独立的磁盘使用,磁盘类型:主分区.扩展分区.逻辑分区. 主分区标记为活动,用于操作系统的引导,一块磁盘最多划分4个主分区,主分区存放操作系统的文件或用户数据. 扩展分区:主分区小于4个时才可以划

linux驱动开发学习路线

这篇文章是和大四学弟交流的文章,贴出来,和大家学习讨论 需要掌握的基本技能: C/C++/ python shell makefile linux基本操作 以android手机为例,我通俗的介绍下市场上产品的软件结构. 手机---> 硬件:cpu(arm架构单片机)+各种传感器(显示屏.距离传感器.温度传感器.gms模块 gprs模块等等).本质上手机就是一个单片机加上一堆传感器,单片机控制各个传感器与人进行负责的交互.(驱动工程师就是在linux底层让传感器可以工作,然后提供控制硬件的接口交给

Linux GDB调试全面解析

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序. 让被调试的程序在工程师指定的断点处停住,断点可以是条件表达式. 当程序被停住时,可以检查此时程序中所发生的事,并追索上文. 动态地改变程序的执行环境. 不管是调试Linux内核空间的驱动还是调试用户空间的应用程序,掌握gdb的用法都是必须.而且,调试内核和调试应用程序时使用的gdb命令是完全相同的,下面以代码清单22.2的应用程