#include <pthread.h> #include <stdio.h> #include <stdlib.h> void* run(void *arg) { printf("hello from %d!n",*(int*)arg); pthread_exit(NULL); } int main() { int ids[4]; pthread_t threads[4]; for (int i = 0; i < 4; i++) { ids[i] = i; printf("create thread %dn",i); threads[i] = pthread_create(&threads[i],NULL,run,(void*)&ids[i]); } for (int i = 0; i < 4; i++) { printf("waiting for %d to join...n",i); pthread_join(threads[i],NULL); printf("thread %d joinedn",i); } pthread_exit(NULL); return 0; }
我编译它
$ gcc -pthread -g -o main main.c
我的输出是
$ ./main create thread 0 create thread 1 create thread 2 create thread 3 waiting for 0 to join... hello from 0! zsh: segmentation fault (core dumped) ./main
你可以看到,它segfaults。 gdb告诉我什么都没有用:
什么会导致exec失败? 接下来发生什么?
用c / c ++在linux中locking文件
什么时候在Windows中的c + +所必需的“外部C”?
*在Linux命令行上
奇怪的c函数语法
$ gdb ./main GNU gdb (GDB) 7.11 copyright (C) 2016 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 "x86_64-pc-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions,please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help,type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from ./main...done. (gdb) r Starting program: /home/picard/projects/bme/pp-lab/sudoku/main [Thread debugging using libthread_db enabled] Using host libthread_db library "/usr/lib/libthread_db.so.1". create thread 0 [New Thread 0x7ffff781a700 (LWP 9660)] hello from 0! create thread 1 [New Thread 0x7ffff7019700 (LWP 9661)] create thread 2 hello from 1! [New Thread 0x7ffff6818700 (LWP 9662)] create thread 3 hello from 2! [New Thread 0x7ffff6017700 (LWP 9663)] hello from 3! waiting for 0 to join... Thread 1 "main" received signal SIGSEGV,Segmentation fault. 0x00007ffff7bc45e0 in pthread_join () from /usr/lib/libpthread.so.0 (gdb) bt #0 0x00007ffff7bc45e0 in pthread_join () from /usr/lib/libpthread.so.0 #1 0x0000000000400786 in main () at main_old.c:22
这里是关于我的系统的一些信息:
$ gcc --version gcc (GCC) 5.3.0 $ uname -a Linux enterprise 4.4.5-1-ARCH #1 SMP PREEMPT Thu Mar 10 07:38:19 CET 2016 x86_64 GNU/Linux
我应该如何继续debugging这个问题?
C#BST时区时期(Windows与Linux)在1971年的差异
如何在Win 7 visual studio 2012的C#中禁用#if DEBUG
find堆空间后的逻辑可用
以root身份执行命令,无需root密码或sudo
pthread(分段错误)
pthread_create成功返回0 ,不是线程ID,所以
threads[i] = pthread_create(&threads[i],(void*)&ids[i]);
应该
if (pthread_create(&threads[i],(void*)&ids[i])) { //take care of the error }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。