c - timer_create 在 i386 系统上导致段错误,但在 x86_64 系统(linux)上没有

标签 c linux timer segmentation-fault posix

我在调用计时器时遇到了一个奇怪的问题。它在我的测试系统 (x64) 上工作,但是当我将它加载到目标系统中,运行 i386 linux 并在那里编译时,它编译正常但抛出段错误。这是可疑的代码:

507: int SwitchData = 0xFF,s, retval = EX_SOFTWARE;
508: struct sigevent sev;
509: struct itimerspec ts;
510: timer_t *tid;

截图

517: if(EX_OK != retval)
518: {
519:     fprintf(stderr,"init failed\n");
520:     return EX_SOFTWARE;
521: }
522: //notify via thread
    523:    sev.sigev_notify = SIGEV_THREAD;
    524:    sev.sigev_notify_function = SwitchThreadHandler;
    525:    sev.sigev_notify_attributes = NULL;
    526:    sev.sigev_value.sival_ptr = tid;
    527:    ts.it_interval.tv_sec = 0;
    528:    ts.it_interval.tv_nsec = 200000000;
    529:    if(-1 == timer_create(CLOCK_REALTIME,&sev,tid))
    530:    {
    531:        retval = EX_SOFTWARE;
    532:        fprintf(stderr,"Failed to create timer.");
    533:        return retval;
    534:    }
    535:    timer_settime(tid,0,&ts,NULL);

因此,回溯指向 timer_create 作为原因。测试系统是内核 3.0.0-24-generic,目标是 3.0.0-17-generic。两个系统都是 gcc v4.6.1。他们都在运行 ubuntu 11.10 安装。

这是运行 catchsegv 时的输出:

*** Segmentation fault
Register dump:

EAX: 005c6ff4   EBX: 003daff4   ECX: 00000000   EDX: 00000001
ESI: 003db228   EDI: 00000000   EBP: 09ba00d0   ESP: bf96b2c8

EIP: 003d7058   EFLAGS: 00010292

CS: 0073   DS: 007b   ES: 007b   FS: 0000   GS: 0033   SS: 007b

Trap: 0000000e   Error: 00000007   OldMask: 00000000
ESP/signal: bf96b2c8   CR2: 005c6ff4

FPUCW: ffff037f   FPUSW: ffff0000   TAG: ffffffff
IPOFF: 00000000   CSSEL: 0000   DATAOFF: 00000000   DATASEL: 0000

ST(0) 0000 0000000000000000   ST(1) 0000 0000000000000000
ST(2) 0000 0000000000000000   ST(3) 0000 0000000000000000
ST(4) 0000 0000000000000000   ST(5) 0000 0000000000000000
ST(6) 0000 0000000000000000   ST(7) 0000 0000000000000000

Backtrace:
/lib/i386-linux-gnu/librt.so.1(timer_create+0x208)[0x3d7058]
/home/vislink/aircam/AircamFrontPanel/FrontPanel.c:529(main)[0x8048fd6]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0x466113]
??:0(_start)[0x80488c1]

Memory map:

00240000-00257000 r-xp 00000000 08:01 131477 /lib/i386-linux-gnu/libpthread-2.13.so
00257000-00258000 r--p 00016000 08:01 131477 /lib/i386-linux-gnu/libpthread-2.13.so
00258000-00259000 rw-p 00017000 08:01 131477 /lib/i386-linux-gnu/libpthread-2.13.so
00259000-0025b000 rw-p 00000000 00:00 0
003d3000-003da000 r-xp 00000000 08:01 131479 /lib/i386-linux-gnu/librt-2.13.so
003da000-003db000 r--p 00006000 08:01 131479 /lib/i386-linux-gnu/librt-2.13.so
003db000-003dc000 rw-p 00007000 08:01 131479 /lib/i386-linux-gnu/librt-2.13.so
00447000-0044b000 r-xp 00000000 08:01 310504 /usr/local/lib/libmpsse.so
0044b000-0044c000 r--p 00003000 08:01 310504 /usr/local/lib/libmpsse.so
0044c000-0044d000 rw-p 00004000 08:01 310504 /usr/local/lib/libmpsse.so
0044d000-005c5000 r-xp 00000000 08:01 131463 /lib/i386-linux-gnu/libc-2.13.so
005c5000-005c7000 r--p 00178000 08:01 131463 /lib/i386-linux-gnu/libc-2.13.so
005c7000-005c8000 rw-p 0017a000 08:01 131463 /lib/i386-linux-gnu/libc-2.13.so
005c8000-005cb000 rw-p 00000000 00:00 0
00600000-00603000 r-xp 00000000 08:01 131480 /lib/i386-linux-gnu/libSegFault.so
00603000-00604000 r--p 00002000 08:01 131480 /lib/i386-linux-gnu/libSegFault.so
00604000-00605000 rw-p 00003000 08:01 131480 /lib/i386-linux-gnu/libSegFault.so
0081f000-0083d000 r-xp 00000000 08:01 131460 /lib/i386-linux-gnu/ld-2.13.so
0083d000-0083e000 r--p 0001d000 08:01 131460 /lib/i386-linux-gnu/ld-2.13.so
0083e000-0083f000 rw-p 0001e000 08:01 131460 /lib/i386-linux-gnu/ld-2.13.so
0093c000-00942000 r-xp 00000000 08:01 308124 /usr/local/lib/libftdi.so.1.20.0
00942000-00943000 r--p 00005000 08:01 308124 /usr/local/lib/libftdi.so.1.20.0
00943000-00944000 rw-p 00006000 08:01 308124 /usr/local/lib/libftdi.so.1.20.0
00a98000-00a9f000 r-xp 00000000 08:01 131345 /lib/libusb-0.1.so.4.4.4
00a9f000-00aa0000 r--p 00006000 08:01 131345 /lib/libusb-0.1.so.4.4.4
00aa0000-00aa1000 rw-p 00007000 08:01 131345 /lib/libusb-0.1.so.4.4.4
00aa1000-00aa2000 rw-p 00000000 00:00 0
00d22000-00d3e000 r-xp 00000000 08:01 130812 /lib/i386-linux-gnu/libgcc_s.so.1
00d3e000-00d3f000 r--p 0001b000 08:01 130812 /lib/i386-linux-gnu/libgcc_s.so.1
00d3f000-00d40000 rw-p 0001c000 08:01 130812 /lib/i386-linux-gnu/libgcc_s.so.1
00d56000-00d57000 r-xp 00000000 00:00 0 [vdso]
08048000-0804b000 r-xp 00000000 08:01 342 /home/vislink/aircam/AircamFrontPanel/debugimage
0804b000-0804c000 r--p 00003000 08:01 342 /home/vislink/aircam/AircamFrontPanel/debugimage
0804c000-0804d000 rw-p 00004000 08:01 342 /home/vislink/aircam/AircamFrontPanel/debugimage
09b9c000-09bc1000 rw-p 00000000 00:00 0 [heap]
b7704000-b7707000 rw-p 00000000 00:00 0
b7711000-b7712000 ---p 00000000 00:00 0
b7712000-b7717000 rw-p 00000000 00:00 0
bf94b000-bf96c000 rw-p 00000000 00:00 0 [stack]

不确定继续的最佳方式。有什么想法吗?

最佳答案

tid 是一个未初始化的指针。您必须声明一个类型为 timer_t 的对象,并将指向该对象的指针传递给 timer_create。您不能只创建一个具有不确定值的 timer_t * 类型的指针对象,然后将该不确定值传递给 timer_create

关于c - timer_create 在 i386 系统上导致段错误,但在 x86_64 系统(linux)上没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12430152/

相关文章:

Java Android App 随机颜色和定时器

C 赋值大于数据类型范围

linux - 递归地创建文件夹的新 tar 文件,排除另一个 tar 文件中包含的文件

linux - 由守护进程提供支持的 Web 服务的最佳方法

python - 重置暂停的抓取,Scrapy

javascript - 使用计时器在 Javascript 中使用参数设置动画

c - 在 Unix 中崩溃时自动释放互斥锁

C printf %c 字符打印

c++ - 为什么序列迭代在 C 宏中有效?

java - 使用 Handler 从 TimerTask 更新 GUI