Linux下获取线程ID的方法

Linux下多线程程序发生coredump时,用

gdb /path/to/program/file core

可以看到所有线程

[email protected]:~/test/thread# gdb a.out core

GNU gdb (GDB) 7.6.1

Copyright (C) 2013 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.  Type "show copying"

and "show warranty" for details.

This GDB was configured as "i486-slackware-linux".

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>...

Reading symbols from /root/test/thread/a.out...done.

[New LWP 826]

[New LWP 825]

但是哪个线程才是导致coredump的线程呢?

一般用gettid()函数就可以得到,但gittid在默认配置下会链接失败

这时就要靠系统调用出马了

#include <stdio.h>
#include <sys/syscall.h>//Linux system call for thread id
#include <assert.h>
#include <pthread.h>

void *nbi(void *arg)
{
        int i;
        printf("child thread lwpid = %u\n", syscall(SYS_gettid));
        printf("child thread tid = %u\n", pthread_self());
        scanf("%d", i);//code dump
}
int main()
{
        pthread_t tid;
        int rc;
        printf("main thread lwpid = %u\n", syscall(SYS_gettid));
        printf("main thread tid = %u\n", pthread_self());
        rc = pthread_create(&tid, NULL, nbi, NULL);
        assert(0 == rc);
        pthread_join(tid, NULL);

        return 0;
}

运行结果:

[email protected]:~/test/thread# ./a.out

main thread lwpid = 825

main thread tid = 3076090112

child thread lwpid = 826

child thread tid = 3076086592

12

Segmentation fault (core dumped)

coredump原因:

(gdb) bt

#0  0xb75ed50e in __GI__IO_vfscanf () from /lib/libc.so.6

#1  0xb75fc183 in __isoc99_scanf () from /lib/libc.so.6

#2  0x080486ca in nbi (arg=0x0) at test.c:12

#3  0xb7728955 in start_thread () from /lib/libpthread.so.0

#4  0xb767e1ae in clone () from /lib/libc.so.6

(gdb)

向0x0000000c(保留地址)写数据导致sigsegv

时间: 2024-10-19 03:46:33

Linux下获取线程ID的方法的相关文章

Linux下获取线程TID的方法——gettid()

如何获取进程的PID(process ID)? 可以使用: #include <unistd.h> pid_t getpid(void); 通过查看头文件说明,可以得到更详细的信息: find /usr/include -name unistd.h /usr/include/asm/unistd.h /usr/include/bits/unistd.h /usr/include/linux/unistd.h /usr/include/sys/unistd.h /usr/include/unis

Linux下获取线程TID的方法

如何获取进程的PID(process ID)? 可以使用: #include <unistd.h> pid_t getpid(void); 通过查看头文件说明,可以得到更详细的信息: find /usr/include -name unistd.h /usr/include/asm/unistd.h /usr/include/bits/unistd.h /usr/include/linux/unistd.h /usr/include/sys/unistd.h /usr/include/unis

linux下查看线程数的方法及超过系统线程最大值的报错

通过/proc伪文件系统说明:Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态.基于/proc文件系统如上所述的特殊性,其内的文件也常被称作虚拟文件,并具有一些独特的特点.例如,其中有些文件虽然使用查看命令查看时会返回大量信息,但文件本身的大小却会显

在Windows及Linux下获取毫秒级运行时间的方法

在Windows下获取毫秒级运行时间的方法 头文件:<Windows.h> 函数原型: /*获取时钟频率,保存在结构LARGE_INTEGER中***/ WINBASEAPI BOOL WINAPI QueryPerformanceFrequency( _Out_ LARGE_INTEGER * lpFrequency ); /*获取从某个时间点开始的时钟周期数,保存在结构LARGE_INTEGER中**/ WINBASEAPI BOOL WINAPI QueryPerformanceFreq

Linux下查找进程id并强制停止进程的脚本

Linux下的tomcat的停止脚本shutdown.sh经常失败,造成tomcat进程没关闭.所以只能手动查找进程id,然后用kill命令来强制停止.每次都要这样查一下,然后再杀进程.感觉有点麻烦,所以就把这个动作写在了脚本里面. 一.思路 这个脚本其实就2步,先获取进程id,然后 kill 掉这个进程. (1)获取进程id的方法 这个可以用 awk命令来获取 ps -ef | grep 你的进程 | grep -v grep | awk '{print $2}' 这里要把这个grep这个用

Linux下Git和GitHub使用方法总结 (码云)

初学先记住这几条,其他慢慢研究. 下面讲如何用码云完成一个项目的提交, 我的步骤 https://git.oschina.net/phpervip/qianzhu(此例:一个企业模板): 先在码云上注册一个帐号. 然后新建项目,就有一个git地址. 本地进入你的项目目录. 初始化项目->建远程连接->获取项目->添加版本->版本提交->远程提交 git init git remote add origin https://git.oschina.net/phpervip/qi

Linux/Unix分配进程ID的方法以及源代码实现

在Linux/Unix系统中.每一个进程都有一个非负整型表示的唯一进程ID.尽管是唯一的.可是进程的ID能够重用.当一个进程终止后,其进程ID就能够再次使用了. 大多数Linux/Unix系统採用延迟重用的算法,使得赋予新建进程ID不同于近期终止进程所使用的ID,这主要是为了防止将新进程误觉得是使用同一ID的某个已终止的先前进程.本文讨论了Linux/Unix分配进程ID的方法以及源代码实现. 分配进程ID的方法 在大多数Linux/Unix系统中,生成一个进程ID方法是:从0開始依次连续分配,

Linux/Unix分配进程ID的方法以及源码实现

在Linux/Unix系统中,每个进程都有一个非负整型表示的唯一进程ID.虽然是唯一的,但是进程的ID可以重用.当一个进程终止后,其进程ID就可以再次使用了.大多数Linux/Unix系统采用延迟重用的算法,使得赋予新建进程ID不同于最近终止进程所使用的ID,这主要是为了防止将新进程误认为是使用同一ID的某个已终止的先前进程.本文讨论了Linux/Unix分配进程ID的方法以及源码实现. 分配进程ID的方法 在大多数Linux/Unix系统中,生成一个进程ID方法是:从0开始依次连续分配,一直到

让你提前认识软件开发(51):VC++集成开发环境中Linux下Pclint工程的配置方法及常见错误修改

第3部分 软件研发工作总结 VC++集成开发环境中Linux下Pclint工程的配置方法及常见错误修改 [文章摘要] Pclint是一种C/C++软件代码静态分析工具.它是一种更加严格的编译器,能够发现普通编译器所不能发现的代码中的很多问题,因此被广泛应用于软件开发项目中. 本文介绍了如何在VC++集成开发环境中配置Linux下的Pclint工程,给出了C语言中pclint规则A检查的常见错误,并描述了对应的修改办法. [关键词] VC++  Pclint  配置  操作  修改 1. 前言 P