1. 程式人生 > >Linux下獲取執行緒ID的方法

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

相關推薦

Linux獲取執行ID方法

Linux下多執行緒程式發生coredump時,用 gdb /path/to/program/file core 可以看到所有執行緒 [email protected]:~/test/thread# gdb a.out core GNU gdb (GDB) 7.6

Linux獲取執行TID的方法——gettid()

2013-01-07 wcdj如何獲取程序的PID(process ID)? 可以使用: #include <unistd.h> pid_t getpid(void);通過檢視標頭檔案說明,可以得到更詳細的資訊:find /usr/include -name u

Linux獲取執行TID的方法——gettid() 獲取程序 getpid()

可以使用: #include <unistd.h> pid_t getpid(void);   通過檢視標頭檔案說明,可以得到更詳細的資訊: find /usr/include -name unistd.h   /usr/include/asm/unistd.h   /usr/inclu

linux執行ID和程序ID

 在描述執行緒ID和程序ID之前我們先來分清楚幾個概念: 1. 使用者級執行緒和核心級執行緒 什麼是使用者級執行緒? 使用者級執行緒核心的切換由使用者態程式自己控制核心切換,不需要

linux獲取執行ID

//獲取執行緒ID: #include <sys/syscall.h> syscall(SYS_gettid); //獲取到的執行緒號與top H的執行緒號一樣 #if defined(OS

linux 執行1

舉例UNIX International 執行緒 UNIX International 執行緒的標頭檔案是<thread.h> [1]  ,僅適用於Sun Solaris作業系統。所以UNIX International執行緒也常被俗稱為Solaris執

獲取執行ID:利用關鍵字__thread減少系統呼叫使用次數

 一、獲取當前執行緒ID的方法 #include <unistd.h> #include <sys/syscall.h> #define gettid() syscall(__NR_gettid) pid_t tid=gettid(); //cur

Notepad++編寫的shell指令碼在linux無法執行的解決方法

Notepad++ 是一款Windows環境下免費開源的程式碼編輯器,支援的語言:C, C++ , Java , C#, XML, HTML, PHP, Javascript! 本文給大家講解的是用notepad++在windows下開發的shell指令碼上傳到li

LinuxJava執行詳細監控和其dump的分析使用----分析Java效能瓶頸[張振華-Jack]

作者:張振華(Jack) 這裡對linux下、sun(oracle) JDK的執行緒資源佔用問題的查詢步驟做一個小結; linux環境下,當發現java程序佔用CPU資源很高,且又要想更進一步

為什麼linux執行程式如此消耗虛擬記憶體

最近遊戲已上線運營,進行伺服器記憶體優化,發現一個非常奇妙的問題,我們的認證伺服器(AuthServer)負責跟第三方渠道SDK打交道(登陸和充值),由於採用了curl阻塞的方式,所以這裡開了128個執行緒,奇怪的是每次剛啟動的時候佔用的虛擬記憶體在2.3G,然後每次處理訊息就增加64M,

linux定時執行任務的方法

cnblogs root dream days 分鐘 ab命令 hour 小時 var 在LINUX中你應該先輸入crontab -e,然後就會有個vi編輯界面,再輸入0 3 * * 1 /clearigame2內容到裏面 :wq 保存退出。 在LINUX中,周

Linux執行模擬生產者/消費者問題

/*用執行緒的同步和互斥來實現"生產者-消費者"問題.*/ /* 多生產者多消費者多緩衝區 生產者和消費者不可同時進行 */ #include <stdio.h> #include <stdlib.h> //#include <unistd.h

C/C++ Linux執行程式設計 #include

1.最基礎,程序同時建立5個執行緒,各自呼叫同一個函式 #include <iostream> #include <pthread.h> //多執行緒相關操作標頭檔案,可移植眾多平臺   using namespa

Linux核心多執行實現方法

參考:http://blog.csdn.net/sharecode/article/details/40076951 1.建立執行緒方法1 kthread_create:       建立執行緒;改函式建立執行緒後,不會馬上執行

linux 檢視執行狀態

前言 在除錯程式時需要檢視各個執行緒的狀態,方便定位問題。 解決 方法1、pstree pstree PID 方法2、top top 然後按H,會顯示執行緒 -p

Linux執行(pthread)程式設計例項

Linux系統下的多執行緒遵循POSIX執行緒介面,稱為 pthread。編寫Linux下的多執行緒程式,需要使用標頭檔案pthread.h,連線時需要使用庫libpthread.a。順便說一下,Linux 下pthread的實現是通過系統呼叫clone()來實現的。clon

Android 開發 知曉各種id資訊(獲取執行ID、activityID、核心ID

/** * Returns the identifier of this process's user. * 返回此程序的使用者的識別符號。 */ Log.e(TAG, "Process.myUid() = " + android.os.Proces

linux 執行epoll程式設計 -socket

轉載自:http://blog.csdn.net/susubuhui/article/details/37906287 Linux socket+epoll+pthread+佇列 實現併發伺服器。程式碼有封裝,僅做參考 Linux下多執行緒epoll程式設計,在高併發下測

linux定時執行任務的方法 crontab

在LINUX中,週期執行的任務一般由cron這個守護程序來處理[ps -ef|grep cron]。cron讀取一個或多個配置檔案,這些配置檔案中包含了命令列及其呼叫時間。cron的配置檔案稱為“crontab”,是“cron table”的簡寫。一、cron在3個地方查詢

windows和linux執行的一些區別

我認為linux的多執行緒不如windows。理由如下:一、功能WaitForSingleObject在linux下可以用pthread_cond_wait來替代實現,但是pthread_cond_wait不能用來等待thread handle。要等待thread handl