gpt4 book ai didi

c - GDB 中的段错误 "in ?? ()"

转载 作者:行者123 更新时间:2023-12-05 07:59:59 25 4
gpt4 key购买 nike

我正在编写一个函数,将文件中的所有单词提取到 char* 中。最初我让它简单地返回 char * 但我改变了它,试图回避据说是不好的做法。这是压缩代码:

int main(int argc, char * argv[]){
char ** searchWords;
FILE * fp = fopen("input.txt", "r");
getSearchWords(&searchWords, fp);

return 0;
}


void getSearchWords(char *** searchWordList, FILE * searchFile){

int wordIndex = 0, scalar = 1;
char ** searchList = malloc(sizeof(char*)*DEFAULT_SEARCH_LENGTH);

for(int i = 0; i < DEFAULT_SEARCH_LENGTH; i++)
*(searchList + i) = malloc(sizeof(char)* MAX_SEARCH_LENGTH);

while(fgets(*(searchList + wordIndex), MAX_SEARCH_LENGTH + 1, searchFile)!= NULL){

if(wordIndex == (DEFAULT_SEARCH_LENGTH*scalar - 1 )){
scalar++;
searchList = realloc(searchList, sizeof(char *) * DEFAULT_SEARCH_LENGTH*scalar);

for(int i = wordIndex+1; i < DEFAULT_SEARCH_LENGTH*scalar ; i++)
*(searchList + i) = malloc(sizeof(char) * MAX_SEARCH_LENGTH );
}// if

wordIndex++;

}// while

fclose(searchFile);
printf("%d\n", wordIndex);
for(int i = 0; i < wordIndex; i++){
*(searchWordList + i) = (searchList + i);
printf("%s\n", **(searchWordList + i));
}
}

段错误来自最后一个 for 循环,但是当我运行 gdb 时,这是我得到的,我不确定为什么或如何处理它:

Program received signal SIGSEGV, Segmentation fault.    
0x00000000006034c8 in ?? ()
(gdb) bt
#0 0x00000000006034c8 in ?? ()
#1 0x00000000006034d0 in ?? ()
#2 0x00000000006034d8 in ?? ()
#3 0x00000000006034e0 in ?? ()
#4 0x00000000006034e8 in ?? ()
#5 0x00000000006034f0 in ?? ()
#6 0xf9d384796456d39a in ?? ()
#7 0x00000000004009e0 in __ctype_b_loc@plt ()
#8 0x00007fffffffe850 in ?? ()
#9 0x0000000000000000 in ?? ()

谢谢

编辑:忘记提及输入文件“input.txt”包含 15 个单词,每个单词占一行。在最后的 for 循环中,它打印所有这些然后遇到段错误。此外,即使我将循环的迭代次数减少 1,它仍然会出现段错误。

最佳答案

可能是由*__ctype_b_loc() == nullptr引起的。
malloc 将使用 isspace() 处理从 /proc/... 读取的字符串,然后函数 检查 cpucore 的数量code>isspace() 取决于当前环境中的语言环境。

但是我不知道是什么问题,它可能与语言环境有关(LC_CTYPE,LC_ALL,...)

一些解决方法:

  1. 为gdb安装debuginfo,例如rhel系列:dnf debuginfo-install glibc
  2. 调用 __ctype_b_loc()*__ctype_b_loc() 然后调试返回值或打印它。

引用:__ctype_b_loc what is its purpose?

如果问题是

尝试使用这些代码对其进行脏补丁。

thread_local bool local_bugfixed = [](){ return setlocale(LC_CTYPE, ""); }();

void the_function_crashed() {
(void)local_bugfixed;
}
  • 我遇到的问题:使用带有 close-source-without-bugfixer 的第三方库。我尝试用 dlmopen(LM_ID_NEWLM) 加载这个 .so,它在 malloc 上崩溃了。 (由于没有提供源代码,我不确定 glibc 的问题是什么。)
  • 因此尝试检查问题是否匹配:在每个线程中尽早调用 setlocale(LC_CTYPE, "");
  • 但是setlocale(LC_ALL, "en_US.UTF-8");还是无效

关于c - GDB 中的段错误 "in ?? ()",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19758739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com