基于GCC的SIGSEGV错误?
所以我一直在写一些C库供我个人使用,直到我的最新库,它只包含一堆字符串函数,我一直在做sweel。正如你可能从题目中可以看出的那样,我收到了一个SIGSEGV信号。问题在于:我的研究表明,大约99%的SIGSEGV错误都是由于堆栈溢出造成的,而堆栈溢出本身是由于错误的递归造成的,但是正如您将看到的,我没有使用任何递归。此外,还出现了一些奇怪的问题。首先,printf表现出许多古怪的行为。GDB遇到printf调用,但实际上似乎直到几行代码之后才执行它们。类似地,我的一个printf语句被分解了,只调用了一部分,另一部分显然被切掉了 这里是关键的代码片段,有些东西被命名为搞笑,因为我怀疑名字冲突可能是原因之一,可能有点过火了 “firstIndexOf”函数(查找字符串中字符的第一个索引,如果该字符位于所述字符串中),位于第31行:基于GCC的SIGSEGV错误?,c,string,gcc,gdb,C,String,Gcc,Gdb,所以我一直在写一些C库供我个人使用,直到我的最新库,它只包含一堆字符串函数,我一直在做sweel。正如你可能从题目中可以看出的那样,我收到了一个SIGSEGV信号。问题在于:我的研究表明,大约99%的SIGSEGV错误都是由于堆栈溢出造成的,而堆栈溢出本身是由于错误的递归造成的,但是正如您将看到的,我没有使用任何递归。此外,还出现了一些奇怪的问题。首先,printf表现出许多古怪的行为。GDB遇到printf调用,但实际上似乎直到几行代码之后才执行它们。类似地,我的一个printf语句被分解了,
int firstIndexOfFUNCTION(char thisChar, char* inThisString)
{
int lengthABC = strlen(inThisString);
printf("\nLength of %s is %d",inThisString,lengthABC);
int thisFunctionsIndex;
for (thisFunctionsIndex=0;thisFunctionsIndex<lengthABC;thisFunctionsIndex++)
{
printf("\n%dth iteration:\n-char 1 is %c\n-char2 is %c",thisFunctionsIndex,inThisString[thisFunctionsIndex],thisChar);
if (inThisString[thisFunctionsIndex] == thisChar)
{
printf("\nMatch found on iteration %d!",thisFunctionsIndex);
return thisFunctionsIndex;
}
}
printf("\nNo matches detected...");
return -3;
}
最后但并非最不重要的一点是,好的ol'main,在第107行:
int main(int argc, char* argv[])
{
string_functions_test();
return 0;
}
以下是我的代码步骤的gdb输出:
(gdb) b 105
Breakpoint 1 at 0x400970: file string_functions.c, line 105.
(gdb) run
Starting program: /home/user/Development/projects/c/string_functions/source/c/a.out
Breakpoint 1, main (argc=1, argv=0x7fffffffde98) at string_functions.c:109
109 string_functions_test();
(gdb) step
string_functions_test () at string_functions.c:64
64 printf("PROGRAM INITIALIZED!\n\n");
(gdb) next
PROGRAM INITIALIZED!
68 sft_string = malloc(sizeof(char)*100);
(gdb) next
69 sft_string = "B um sbm. Sbm B bm.";
(gdb) next
71 printf("2nd BREAKPOINT");
(gdb) next
73 sft_index = firstIndexOfFUNCTION('B',sft_string);
(gdb) step
firstIndexOfFUNCTION (thisChar=66 'B', inThisString=0x400ab9 "B um sbm. Sbm B bm.") at string_functions.c:33
33 int lengthABC = strlen(inThisString);
(gdb) next
34 printf("\nLength of %s is %d",inThisString,lengthABC);
(gdb) next
2nd BREAKPOINT
36 for (thisFunctionsIndex=0;thisFunctionsIndex<lengthABC;thisFunctionsIndex++)
(gdb) next
38 printf("\n%dth iteration:\n-char 1 is %c\n-char2 is %c",thisFunctionsIndex,inThisString[thisFunctionsIndex],thisChar);
(gdb) next
Length of B um sbm. Sbm B bm. is 19
0th iteration:
-char 1 is B
39 if (inThisString[thisFunctionsIndex] == thisChar)
(gdb) next
41 printf("\nMatch found on iteration %d!",thisFunctionsIndex);
(gdb) next
-char2 is B
42 return thisFunctionsIndex;
(gdb) next
47 }
(gdb) next
string_functions_test () at string_functions.c:75
75 sft_string[sft_index] = 'I';
(gdb) next
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400883 in string_functions_test () at string_functions.c:75
75 sft_string[sft_index] = 'I';
(gdb) next
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb) quit
首先将指针
sft\u string
指向从malloc
返回的内容。在下一行中,将其指向一个文本字符串。你需要复制它。文本内置于源代码中,在执行过程中无法更改。否则会引发段错误,这意味着内存中包含代码的区域正在更改。使用strcpy
“研究表明,大约99%的SIGSEGV错误是由于堆栈溢出造成的”-您的研究是错误的。您的printf()
s是不可预测的,因为实际上它们都不以换行符结尾,所以不会刷新。大约花了20秒。:-)<代码>sft_字符串=malloc(sizeof(char)*100);sft_string=“B um sbm.sbm B bm.”代码>@PaulGriffiths实际的百分比是多少?@2501:这是基于“99%的SIGSEGV错误都是由于……错误的递归”这一事实,这显然是荒谬的。如果你需要更多的“信息”来让自己确信这一点,你必须从比我更有耐心的人那里获得。@PaulGriffiths,但我真的很想从你那里获得这些信息。你应该注意,字符串文字的赋值会泄漏分配的内存,这本身就是一个问题。
(gdb) b 105
Breakpoint 1 at 0x400970: file string_functions.c, line 105.
(gdb) run
Starting program: /home/user/Development/projects/c/string_functions/source/c/a.out
Breakpoint 1, main (argc=1, argv=0x7fffffffde98) at string_functions.c:109
109 string_functions_test();
(gdb) step
string_functions_test () at string_functions.c:64
64 printf("PROGRAM INITIALIZED!\n\n");
(gdb) next
PROGRAM INITIALIZED!
68 sft_string = malloc(sizeof(char)*100);
(gdb) next
69 sft_string = "B um sbm. Sbm B bm.";
(gdb) next
71 printf("2nd BREAKPOINT");
(gdb) next
73 sft_index = firstIndexOfFUNCTION('B',sft_string);
(gdb) step
firstIndexOfFUNCTION (thisChar=66 'B', inThisString=0x400ab9 "B um sbm. Sbm B bm.") at string_functions.c:33
33 int lengthABC = strlen(inThisString);
(gdb) next
34 printf("\nLength of %s is %d",inThisString,lengthABC);
(gdb) next
2nd BREAKPOINT
36 for (thisFunctionsIndex=0;thisFunctionsIndex<lengthABC;thisFunctionsIndex++)
(gdb) next
38 printf("\n%dth iteration:\n-char 1 is %c\n-char2 is %c",thisFunctionsIndex,inThisString[thisFunctionsIndex],thisChar);
(gdb) next
Length of B um sbm. Sbm B bm. is 19
0th iteration:
-char 1 is B
39 if (inThisString[thisFunctionsIndex] == thisChar)
(gdb) next
41 printf("\nMatch found on iteration %d!",thisFunctionsIndex);
(gdb) next
-char2 is B
42 return thisFunctionsIndex;
(gdb) next
47 }
(gdb) next
string_functions_test () at string_functions.c:75
75 sft_string[sft_index] = 'I';
(gdb) next
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400883 in string_functions_test () at string_functions.c:75
75 sft_string[sft_index] = 'I';
(gdb) next
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb) quit
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>