C Seg故障?你能找到它吗?因为我可以';T
到现在为止,我已经看了大约15遍了,都没有用。我不明白为什么这是seg断层?甚至连“打印”语句都没有,这毫无意义。错误代码确实有效(当我没有共享内存时),我有一个load.c程序,但它工作得很好(我100%确信这一点)C Seg故障?你能找到它吗?因为我可以';T,c,segmentation-fault,C,Segmentation Fault,到现在为止,我已经看了大约15遍了,都没有用。我不明白为什么这是seg断层?甚至连“打印”语句都没有,这毫无意义。错误代码确实有效(当我没有共享内存时),我有一个load.c程序,但它工作得很好(我100%确信这一点) Valigrind和GDB是你的朋友 请提供完整的代码,以便我们可以编译它并帮助您。盯着源代码并不是调试的神奇方法:) 确保使用编译器上的调试选项(-g等)进行编译 否则,请检查valgrind的memcheck。编译好程序后,运行: valgrind./myprogram 您可
Valigrind和GDB是你的朋友 请提供完整的代码,以便我们可以编译它并帮助您。盯着源代码并不是调试的神奇方法:) 确保使用编译器上的调试选项(-g等)进行编译 否则,请检查valgrind的memcheck。编译好程序后,运行:
valgrind./myprogram
您可能会得到如下类似的输出:
==584== Use of uninitialised value of size 8
==584== at 0x400480: segfaultme (p.c:6)
==584== by 0x40049B: main (p.c:13)
==584==
==584== Invalid write of size 4
==584== at 0x400480: segfaultme (p.c:6)
==584== by 0x40049B: main (p.c:13)
==584== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==584==
==584==
==584== Process terminating with default action of signal 11 (SIGSEGV)
==584== Access not within mapped region at address 0x0
==584== at 0x400480: segfaultme (p.c:6)
==584== by 0x40049B: main (p.c:13)
==584== If you believe this happened as a result of a stack
==584== overflow in your program's main thread (unlikely but
==584== possible), you can try to increase the size of the
==584== main thread stack using the --main-stacksize= flag.
==584== The main thread stack size used in this run was 10485760.
用以下方法破解GDB:
gdb./myprog
然后输入rreturn
您将获得更多有关SEGFULT确切发生位置的信息:
(gdb) r
Starting program: /home/aiden/tmp/a.out
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400480 in segfaultme (p=0x0) at p.c:6
6 *p = 22;
Missing separate debuginfos, use: debuginfo-install glibc-2.11.2-1.x86_64
(gdb) bt
#0 0x0000000000400480 in segfaultme (p=0x0) at p.c:6
#1 0x000000000040049c in main () at p.c:13
输入btreturn也会给你一个回溯。在上面的示例中,我们可以看到segfaultme()
中p.c
的第6行是问题所在,其中我取消引用p
,它显示segfaultme()
是由main()
调用的
希望这有帮助!记住尽可能多地接触有助于你的工具 Valigrind和GDB是你的朋友 请提供完整的代码,以便我们可以编译它并帮助您。盯着源代码并不是调试的神奇方法:) 确保使用编译器上的调试选项(-g等)进行编译 否则,请检查valgrind的memcheck。编译好程序后,运行:
valgrind./myprogram
您可能会得到如下类似的输出:
==584== Use of uninitialised value of size 8
==584== at 0x400480: segfaultme (p.c:6)
==584== by 0x40049B: main (p.c:13)
==584==
==584== Invalid write of size 4
==584== at 0x400480: segfaultme (p.c:6)
==584== by 0x40049B: main (p.c:13)
==584== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==584==
==584==
==584== Process terminating with default action of signal 11 (SIGSEGV)
==584== Access not within mapped region at address 0x0
==584== at 0x400480: segfaultme (p.c:6)
==584== by 0x40049B: main (p.c:13)
==584== If you believe this happened as a result of a stack
==584== overflow in your program's main thread (unlikely but
==584== possible), you can try to increase the size of the
==584== main thread stack using the --main-stacksize= flag.
==584== The main thread stack size used in this run was 10485760.
用以下方法破解GDB:
gdb./myprog
然后输入rreturn
您将获得更多有关SEGFULT确切发生位置的信息:
(gdb) r
Starting program: /home/aiden/tmp/a.out
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400480 in segfaultme (p=0x0) at p.c:6
6 *p = 22;
Missing separate debuginfos, use: debuginfo-install glibc-2.11.2-1.x86_64
(gdb) bt
#0 0x0000000000400480 in segfaultme (p=0x0) at p.c:6
#1 0x000000000040049c in main () at p.c:13
输入btreturn也会给你一个回溯。在上面的示例中,我们可以看到segfaultme()
中p.c
的第6行是问题所在,其中我取消引用p
,它显示segfaultme()
是由main()
调用的
希望这有帮助!记住尽可能多地接触有助于你的工具 您的问题可能来自您使用的
shmat
。在C语言中,永远不要强制转换这样一个函数的返回类型。您觉得有必要使用它,这可能意味着您收到了一条虚假的错误消息,这是因为您缺少“sys/shm.h”头
在这种情况下,gcc采用int
的返回类型,通常是32位的数量,并将其重新解释为指针。因此,shmat
提供给您的地址的上半部分丢失
一般来说,不要抛弃问题。如果所有的头都写得很好,那么在C中很少需要Cast。强制转换系统函数的返回类型几乎总是错误的。您的问题可能来自使用
shmat
。在C语言中,永远不要强制转换这样一个函数的返回类型。您觉得有必要使用它,这可能意味着您收到了一条虚假的错误消息,这是因为您缺少“sys/shm.h”头
在这种情况下,gcc采用int
的返回类型,通常是32位的数量,并将其重新解释为指针。因此,shmat
提供给您的地址的上半部分丢失
一般来说,不要抛弃问题。如果所有的头都写得很好,那么在C中很少需要Cast。强制转换系统函数的返回类型几乎总是错误的。1。你试过valgrind吗?2.错误可能在header.h中的Wait或Signal或其他内容中,我们无法知道。main()必须声明为在调试器中返回intStart,以查看segfault发生的位置。这会给你一个提示。如果你希望我们在你的代码中发现bug,至少附加所有bug,这样我们就不用费劲地编译它了(例如,header.h是什么?)哦,对不起,我会附加header.h,但是我不太熟悉在unix中使用调试器(我习惯于Visual Studio,但因为我使用了很多Posix的东西,所以我不得不在unix中执行)。在unix中使用调试器有什么提示吗?而且它不是主要的int(),我试过了,我的其他文件也没有。1。你试过valgrind吗?2.错误可能在header.h中的Wait或Signal或其他内容中,我们无法知道。main()必须声明为在调试器中返回intStart,以查看segfault发生的位置。这会给你一个提示。如果你希望我们在你的代码中发现bug,至少附加所有bug,这样我们就不用费劲地编译它了(例如,header.h是什么?)哦,对不起,我会附加header.h,但是我不太熟悉在unix中使用调试器(我习惯于Visual Studio,但因为我使用了很多Posix的东西,所以我不得不在unix中执行)。在unix中使用调试器有什么提示吗?而且它不是主要的int(),我试过了,我的其他文件也没有。我们的教授给了我们示例代码,他就是这样得到的?我再也不知道了。不过,它似乎与G++配合得很好。但我的意思是,我是共享内存新手,所以大多数类代码都是从他的示例代码中采用的是的,在C语言中,没有必要将
void*
指针强制转换为任何其他数据指针void*
是指针的全部类型,它与其他指针(数据指针)的赋值兼容。正是这种类型的转换带来了你的问题:对于C,一个未知的函数应该返回int
,然后你的转换告诉他“我知道我在做什么”。所以这里的演员真的很糟糕,它隐藏了一个潜在的问题。你应该仔细指导你的教授采用一种更好的编程风格。啊哈,我想我明白你现在在说什么了。我只是看了一下我的操作系统教授的示例代码/注释