精华内容
下载资源
问答
  • 可以在一段时间内,多执行几次pstack,若发现代码栈总是停在同一个位置,那个位置就需要重点关注,很可能就是出问题的地方; 示例:查看bash程序进程栈: /opt/app/tdev1$ps -fe| grep bash tdev1 ...

    pstack

    pstack用来跟踪进程栈,这个命令在排查进程问题时非常有用,比如我们发现一个服务一直处于work状态(如假死状态,好似死循环),使用这个命令就能轻松定位问题所在;可以在一段时间内,多执行几次pstack,若发现代码栈总是停在同一个位置,那个位置就需要重点关注,很可能就是出问题的地方;

    示例:查看bash程序进程栈:

     

    
     
    1. /opt/app/tdev1$ps -fe| grep bash

    2. tdev1 7013 7012 0 19:42 pts/1 00:00:00 -bash

    3. tdev1 11402 11401 0 20:31 pts/2 00:00:00 -bash

    4. tdev1 11474 11402 0 20:32 pts/2 00:00:00 grep bash

    5. /opt/app/tdev1$pstack 7013

    6. #0 0x00000039958c5620 in __read_nocancel () from /lib64/libc.so.6

    7. #1 0x000000000047dafe in rl_getc ()

    8. #2 0x000000000047def6 in rl_read_key ()

    9. #3 0x000000000046d0f5 in readline_internal_char ()

    10. #4 0x000000000046d4e5 in readline ()

    11. #5 0x00000000004213cf in ?? ()

    12. #6 0x000000000041d685 in ?? ()

    13. #7 0x000000000041e89e in ?? ()

    14. #8 0x00000000004218dc in yyparse ()

    15. #9 0x000000000041b507 in parse_command ()

    16. #10 0x000000000041b5c6 in read_command ()

    17. #11 0x000000000041b74e in reader_loop ()

    18. #12 0x000000000041b2aa in main ()

    strace

    strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
    示例:

     

    
     
    1. $strace cat /dev/null

    2. execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0

    3. brk(0) = 0xab1000

    4. access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)

    5. mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000

    6. access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)

    7. ...

    8.  

    每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。 strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。

    跟踪可执行程序

     

    strace -f -F -o ~/straceout.txt myserver
    

    -f -F选项告诉strace同时跟踪fork和vfork出来的进程,-o选项把所有strace输出写到~/straceout.txt里 面,myserver是要启动和调试的程序。

    跟踪服务程序

     

    strace -o output.txt -T -tt -e trace=all -p 28979
    

    跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。



    作者:杀破魂
    链接:https://www.jianshu.com/p/d6686cb72f68
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    gcc test.c -o test -lpthread -g

    1.gdb test

    2.list(l):list命令显示多行源代码,从上次的位置开始显示,默认情况下,一次显示10行,第一次使用时,从代码其实位置显示。

    
     
    1. list n显示已第n行未中心的10行代码

    2. list functionname显示以functionname的函数为中心的10行代码

    3.break(b):

    
     
    1. break location:在location位置设置断点,该位置可以为某一行,某函数名或者其它结构的地址。gdb会在执行该位置的代码之前停下来.

    2.  
    3. 使用delete breakpoints 断点号——————删除断点

    4. 这里的断点号表示的是第几个断点,刚才执行break 10返回

    5. breakpoint 1 at 0x40050a: file test.c, line 10.

    6. 中的1表示该断点的标号,因此使用 delete breakpoints 1表示删除第10行所定义的断点

    7.  
    8. clear n表示清除第n行的断点,因此clear 10等同于delete breakpoints 1

    9. disable/enable n表示使得编号为n的断点暂时失效或有效

    10.  
    11. 可使用info查看断点相关的信息

    12. info breakpoints

    13.  
    14. c(continue),继续程序运行直到下一个断点

    3.c(continue)

    3.display命令
    查看参数的值

    4.step及next命令
    step可使得程序逐条执行,即执行完一条语句然后在下一跳语句前停下来,等待用户的命令。一般使用step命令时,可使用display或者watch命令查看变量的变化,从而判断程序行为是否符合要求。当下一条指令为函数时,s进入函数内部,在其第一条语句前停下来。next单步执行,但不进入函数内部。
    step n,next n 表示连续但不执行n条指令,如果期间遇到断点,则停下来。

    5.print打印内部变量值
    6.bt 查看堆栈信息
    7.watch 监视变量值的变化

    watch通常需要和break,run,continue联合使用。

    8.set variable value=x 动态改变变量值

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    1.线程的查看

    首先创建两个线程

    
     
    1. #include <stdio.h>

    2. #include <unistd.h>

    3. #include <pthread.h>

    4. #include <stdlib.h>

    5. #include <string.h>

    6. #include <iostream>

    7. using namespace std;

    8.  
    9. void* pthread_run1(void* arg)

    10. {

    11. (void)arg;

    12.  
    13. while(1)

    14. {

    15. cout << "I am thread1,ID" << pthread_self() << endl;

    16. sleep(1);

    17. }

    18. }

    19.  
    20. void* pthread_run2(void* arg)

    21. {

    22. (void)arg;

    23. while(1)

    24. {

    25. cout << "I am thread2 ID:" << pthread_self() << endl;

    26. sleep(1);

    27. }

    28. }

    29.  
    30. int main()

    31. {

    32. pthread_t tid1;

    33. pthread_t tid2;

    34.  
    35. pthread_create(&tid1,NULL,pthread_run1,NULL);

    36. pthread_create(&tid2,NULL,pthread_run2,NULL);

    37.  
    38. cout << "I am main thread" << endl;

    39.  
    40. pthread_join(tid1,NULL);

    41. pthread_join(tid2,NULL);

    42. return 0;

    43. }

    分析:在上面的程序中创建了两个线程,程序执行起来,main函数所在的程序为主线程,在这个主线程中有两个新的线程运行
    命令行查看:pstree -p 进程ID 

    
     
    1. //查看但钱运行的进程

    2. ps -aux | grep 执行文件

    3.  
    4. //查看当前运行的轻量级进程

    5. ps -aL | grep 执行文件

    6.  
    7. //查看主线程和新线程的关系

    8. pstree -p 主线程ID

    在这里插入图片描述

    在这里插入图片描述

    2.线程栈结构的查看

    
     
    1. 1.获取线程ID

    2. 2.通过命令查看栈结构 pstack 线程ID

    在这里插入图片描述

    在这里插入图片描述

    3.利用gdb查看线程信息

    1.将进程附加到gdb调试器当中,查看是否创建了新线程:gdb attach 主线程ID
    在这里插入图片描述

    在这里插入图片描述
    2.查看线程的一些信息

    
     
    1. //1.查看进程:info inferiors

    2. //2.查看线程:info threads

    3. //3.查看线程栈结构:bt

    4. //4.切换线程:thread n(n代表第几个线程)

    在这里插入图片描述

    在这里插入图片描述

    4.利用gdb调试多线程

    当程序没有启动,线程还没有执行,此时利用gdb调试多程序和调试普通程序一样,通过设置断点,运行,查看信息等等,在这里不演示了,最后会加上调试线程的命令
    1.设置断点:

    
     
    1. //1.设置断点:break 行号/函数名

    2. //2.查看断点:info b

    在这里插入图片描述

    在这里插入图片描述
    2.执行线程2的函数,执行完毕继续运行到断点处

    
     
    1. 1.继续使某一线程运行:thread apply 1-n(第几个线程)n

    2. 2.重新启动陈故乡运行到断点处:r

    在这里插入图片描述

    在这里插入图片描述
    3.只运行当前线程

    
     
    1. 1.设置:set scheduler-locking on

    2. 2.运行:n

    在这里插入图片描述

    在这里插入图片描述
    4.所有线程并发执行:

    
     
    1. 1.设置:set scheduler-locking off

    2. 2.运行:n

    在这里插入图片描述

    在这里插入图片描述

    **总结:**调试多线程的命令

    命令    用法
    info threads    显示当前可调试的所有线程,每个线程有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID 。前面的有*的是当前调试的线程
    thread ID    切换但钱的线程为指定ID的线程
    break thread_test.c:123 thread all(例:在相应函数的位置设置断点break pthread_run1)    在所有线程中相应的行上设置断点
    thread apply ID1 ID2 command    让一个或者多个线程执行GDB命令command
    thread apply all command    让所有被调试线程执行GDB命令command
    set scheduler-locking 选项 command    设置线程是以什么方式来执行命令
    set scheduler-locking off    不锁定任何线程,也就是所有线程都执行,这是默认值
    set scheduler-locking on    只有当前被调试程序会执行
    set scheduler-locking on step    在单步的时候,除了next过一个函数的情况(熟悉情况的人都知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行
    ————————————————
    版权声明:本文为CSDN博主「_kean」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/C1029323236/article/details/97512823

    展开全文
  • pthread_cancel函数 杀死(取消)线程 其作用,对应进程中 kill() 函数。 函数原型:int pthread_...通常是一些系统调用creat,open,pause,close,read,write… 执行命令man 7 pthreads可以查看具备这些取消

    pthread_cancel函数

    • 杀死(取消)线程

    • 其作用,对应进程中 kill() 函数。

    • 函数原型:int pthread_cancel(pthread_t thread);

    • 成功:0;失败:错误号

      【注意】:线程的取消并不是实时的,而有一定的延时。需要等待线程到达某个取消点(检查点)。
      取消点:是线程检查是否被取消,并按请求进行动作的一个位置。通常是一些系统调用creat,open,pause,close,read,write… 执行命令man 7 pthreads可以查看具备这些取消点的系统调用列表。也可参阅 APUE.12.7 取消选项小节。
      可粗略认为一个系统调用(进入内核)即为一个取消点。如线程中没有取消点,可以通过调用pthreestcancel函数自行设置一个取消点。
      被取消的线程, 退出值定义在Linux的pthread库中。常数PTHREAD_CANCELED的值是-1。可在头文件pthread.h中找到它的定义:#define PTHREAD_CANCELED ((void *) -1)。因此当我们对一个已经被取消的线程使用pthread_join回收时,得到的返回值为-1。

    实例:杀死线程的三种方法

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <stdlib.h>
    
    void * tfn1(void * arg)
    {
      pritnf("thread 1 runing\n");
      return (void*)111;
    }
    
    void * tfn2(void * arg)
    {
      pritnf("thread 2  runing\n");
      return (void*)222;
    }
    
    void * tfn3(void * arg)
    {
       while(1)
       {
     }
     return (void *)666;
    }
    
    int main(void)
    {
      pthread_t tid;
      void * tret =NULL;
      pthread_creat(*tid,NULL,tfn1,NULL) ;
      pthread_join(tid,&tret);
      printf("thread 1 exit code =%d\n",(int)tret);
    
    
      pthread_creat(*tid,NULL,tfn2,NULL) ;
      pthread_join(tid,&tret);
      printf("thread 2 exit code =%d\n",(int)tret);
    
    
      pthread_creat(*tid,NULL,tfn2,NULL) ;
      sleep(3);
      pthread_cancel(tid);
      pthread_join(tid,&tret);
      printf("thread 3 exit code =%d\n",(int)tret);
     
    }
    

    输出:
    在这里插入图片描述
    线程3没死,因为pthread_cancel 杀死线程不是实时的,只有到达取消点才能杀死

    取消点:系统调用,函数调用
    情况一:
    系统调用当取消点

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <stdlib.h>
    
    void * tfn1(void * arg)
    {
      pritnf("thread 1 runing\n");
      return (void*)111;
    }
    
    void * tfn2(void * arg)
    {
      pritnf("thread 2  runing\n");
      return (void*)222;
    }
    
    void * tfn3(void * arg)
    {
       while(1)
       {
        printf("thread 3: I'm going to die in 3 seconds ...\n");
    	/sleep(1);
     }
     return (void *)666;
    }
    
    int main(void)
    {
      pthread_t tid;
      void * tret =NULL;
      pthread_creat(*tid,NULL,tfn1,NULL) ;
      pthread_join(tid,&tret);
      printf("thread 1 exit code =%d\n",(int)tret);
    
    
      pthread_creat(*tid,NULL,tfn2,NULL) ;
      pthread_join(tid,&tret);
      printf("thread 2 exit code =%d\n",(int)tret);
    
    
      pthread_creat(*tid,NULL,tfn2,NULL) ;
      sleep(3);
      pthread_cancel(tid);
      pthread_join(tid,&tret);
      printf("thread 3 exit code =%d\n",(int)tret);
     
    }
    

    结果:
    线程3调用了系统调用,所以pthread_cancel能杀死线程

    情况二:
    自己添加取消点:pthread_testcancel()

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <stdlib.h>
    
    void * tfn1(void * arg)
    {
      pritnf("thread 1 runing\n");
      return (void*)111;
    }
    
    void * tfn2(void * arg)
    {
      pritnf("thread 2  runing\n");
      return (void*)222;
    }
    
    void * tfn3(void * arg)
    {
       while(1)
       {
        phread_testcancel()  ;//自己添加取消点
     }
     return (void *)666;
    }
    
    int main(void)
    {
      pthread_t tid;
      void * tret =NULL;
      pthread_creat(*tid,NULL,tfn1,NULL) ;
      pthread_join(tid,&tret);
      printf("thread 1 exit code =%d\n",(int)tret);
    
    
      pthread_creat(*tid,NULL,tfn2,NULL) ;
      pthread_join(tid,&tret);
      printf("thread 2 exit code =%d\n",(int)tret);
    
    
      pthread_creat(*tid,NULL,tfn2,NULL) ;
      sleep(3);
      pthread_cancel(tid);
      pthread_join(tid,&tret);
      printf("thread 3 exit code =%d\n",(int)tret);
     
    }
    

    输出:
    在这里插入图片描述

    展开全文
  • linux命令

    2018-08-16 10:54:17
    top:是linux下常用的性能分析工具,能够实时的显示系统中各个进程的资源占用情况,类似于windows的资源管理器,查看系统的cpu,内存,运行时间,交互分区,执行线程等信息。对进程状态进行实时监控。 ps:显示系统...

    linux常见命令:

    top:是linux下常用的性能分析工具,能够实时的显示系统中各个进程的资源占用情况,类似于windows的资源管理器,查看系统的cpu,内存,运行时间,交互分区,执行线程等信息。对进程状态进行实时监控。

    ps:显示系统进程在瞬间的运行状态

        参数-ef:e:显示所有进程,f:全格式

    mv:文件/目录改名或变更存储位置

    find:在指定的路径下查找指定文件

        常用:find /home -name "*.txt"

    df:检查磁盘占用空间情况

    cat:将文件的内容打印到标准输出

    chmod:改变文件的权限

    chgrp:改变文件的所属组

    grep:过滤文本,根据给定的字符串,对文件的每一行进行搜索,如找到,则输出该行的内容。

    wc:统计指定文件的字节数,字数,行数,并显示输出。

    ls:列出目录

    cp:复制

    rm:删除

    mkdir:建立目录

    tar:打包文件

    mount:挂载/卸载指定的文件系统

    ifconfig:配置网络或者显示当前网络接口状态

    telent:远程登录,同ssh功能

    vim编辑器中,选中,复制,粘贴,删除的命令是什么?

      选中:v

      复制:y

      粘贴:p

      删除:d

    获取文件的行数

      wc -l filename

    查看文件所包含的hello行

      grep hello 文件名

    如何把一个文件的内容添加到领一个文件的末尾

      cat file1 >> file 2

           将带有某个词的那一行写到文件2

           cat test.txt | grep "hello" >> test2.txt

    如何实时的显示一个文件的输出

      more或者less

    定时执行一个程序的方法是什么?

      可以使用at或者crontab,at是仅执行一次就结束调度的命令,而crontab是可以循环一直执行下去的。

    linux下如何查看所有的用户

      cat /etc/passwd

    find 和grep的区别

        find:在磁盘/分区中找到文件,可以配 type 可以配 size time 等,通过文件名或文件大

    小或访问时间找到指定文件。

        grep:查找文件里符合条件的字符串,并把匹配的行打印出来,可以使用正则表达式。 

    展开全文
  • 由于线上应用出问题,查找原因,... 动态生成headump方法,在linux任意位置执行:  jmap -F -dump:format=b,file=temp_heapdump.hprof Pid    使用ibm的就jca看比较细一些,可以查看哪些程序占用的内存过多 ...

       由于线上应用出问题,查找原因,查看线程活动情况,使用java自带的jvisual 。

       动态生成headump方法,在linux任意位置执行:

        jmap -F -dump:format=b,file=temp_heapdump.hprof Pid

       

      使用ibm的就jca看比较细一些,可以查看哪些程序占用的内存过多

    展开全文
  • Linux面试题

    2017-03-19 10:16:32
    **1、**PCB进程控制块可以用locate sched.h命令来查看位置。 2、一个进程默认打开文件的个数1024。 3、进程和线程的差别 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程...
  • Linux常用命令

    2018-11-14 09:59:17
    top:是linux下常用的性能分析工具,能够实时的显示系统中各个进程的资源占用情况,类似于windows的资源管理器,查看系统的cpu,内存,运行时间,交互分区,执行线程等信息。对进程状态进行实时监控。 ps:显示系统...
  • 常用的Linux命令

    2019-03-11 11:16:44
    top:是linux下常用的性能分析工具,能够实时的显示系统中各个进程的资源占用情况,类似于windows的资源管理器,查看系统的cpu,内存,运行时间,交互分区,执行线程等信息。对进程状态进行实时监控。 ps:显示系统...
  • linux命令之面试题1

    2017-10-15 20:23:00
    top:是linux下常用的性能分析工具,能够实时的显示系统中各个进程的资源占用情况,类似于windows的资源管理器,查看系统的cpu,内存,运行时间,交互分区,执行线程等信息。对进程状态进行实时监控。 ps:显示系统...
  • 使用该命令可以查看crontab的安装位置,如果没有安装则提示不存在crontab,要执行以下命令进行安装 安装cron主程序 yum -y install vixie-cron 在安装驱动cron守护线程的表格程序 yum -y install c...
  • Linux系统分析part2

    2008-10-29 14:56:33
    3.4 Linux系统下应用程序的远程执行 24 3.4.1 Telnet 25 3.4.2 远程命令 25 3.4.3 X Window 25 3.5 Linux系统的网络互连功能 25 3.5.1 路由器 25 3.5.2 网桥 25 3.5.3 IP伪装 25 3.5.4 IP统计 26 3.5.5 IP 别名 26 ...
  • Linux系统分析part1

    2008-10-29 14:20:24
    3.4 Linux系统下应用程序的远程执行 24 3.4.1 Telnet 25 3.4.2 远程命令 25 3.4.3 X Window 25 3.5 Linux系统的网络互连功能 25 3.5.1 路由器 25 3.5.2 网桥 25 3.5.3 IP伪装 25 3.5.4 IP统计 26 3.5.5 IP 别名 26 ...
  • 3.4 Linux系统下应用程序的远程执行 3.4.1 Telnet 3.4.2 远程命令 3.4.3 X Window 3.5 Linux系统的网络互连功能 3.5.1 路由器 3.5.2 网桥 3.5.3 IP伪装 3.5.4 IP统计 3.5.5 IP别名 3.5.6 流量限制器 3.5.7 防火墙 ...
  • 文章目录基础知识cpu上下文切换进程上下文切换线程上下文切换中断上下文切换分析系统上下文切换的情况查看系统上下文切换情况查看单个进程的上下文切换状态如果发现vmstat 的 cs 和 pidstata的 cswch 数据对不上 ...
  • 3.4 Linux系统下应用程序的远程执行 24 3.4.1 Telnet 25 3.4.2 远程命令 25 3.4.3 X Window 25 3.5 Linux系统的网络互连功能 25 3.5.1 路由器 25 3.5.2 网桥 25 3.5.3 IP伪装 25 3.5.4 IP统计 26 3.5.5 IP 别名 26 ...
  • 3.4 Linux系统下应用程序的远程执行 24 3.4.1 Telnet 25 3.4.2 远程命令 25 3.4.3 X Window 25 3.5 Linux系统的网络互连功能 25 3.5.1 路由器 25 3.5.2 网桥 25 3.5.3 IP伪装 25 3.5.4 IP统计 26 3.5.5 IP 别名 26 ...
  • 3.4 Linux系统下应用程序的远程执行 24 3.4.1 Telnet 25 3.4.2 远程命令 25 3.4.3 X Window 25 3.5 Linux系统的网络互连功能 25 3.5.1 路由器 25 3.5.2 网桥 25 3.5.3 IP伪装 25 3.5.4 IP统计 26 3.5.5 IP 别名 26 ...
  • bin指用二进制方式传送(可执行文件进);默认为ASCII格式传送(文本文件时) route print 显示出IP路由,将主要显示网络地址Network addres,子网掩码Netmask,网关地址Gateway addres,接口地址Interface arp ...
  • 能运行于所有的主流平台包括 Windows、Linux 、Unix 及 Mac OS; 多线程多连接。所有这些功能特性在同类工具中表现突出,甚至是本工具独有的! 还有,它能快速显示SQL的解释计划;能运行/调试 PL/SQL 语句;精确的...

空空如也

空空如也

1 2 3 4 5
收藏数 89
精华内容 35
关键字:

linux查看线程执行位置

linux 订阅