Tag: segmentation fault

分段故障 – strcat

这是我的代码: #include #include #include void main(int arge, char *argv[]) { FILE *f1; char ch,*fn=”~/lyrics/”; strcat(fn,argv[1]); strcat(fn,”.txt”); if( (f1 = fopen(fn,”r”))==NULL ) { printf(“\nWrong filename\n%s not found”,argv[1]); return; } while((ch=getw(f1))!=EOF) { printf(“%c”,ch); } } 我使用gcc -g -o file file.c编译它,编译器没有给出任何错误消息。 但是当我运行它时,我收到错误消息: Segmentation fault (core dumped) Bad permissions for mapped region at address 0x8048659 at 0x402C36B: strcat (in […]

如何使用GDB从多个文件中找到分段错误

我在面试中被问到如何使用GDB在C程序中调试分段错误 。 我告诉他们我们可以使用-g选项编译我们的程序,因为它可以将调试信息添加到二进制文件中并且可以读取核心转储文件但是然后面试官告诉我他们是否有3到4个文件一起编译但是其中一个导致了分段错误然后我们如何在GDB中调试?

什么可以导致Java本机函数(在C中)在进入时出现段错误?

该项目 我正在使用Java Native Interface将Java命令行界面编写到内部网络和网络测试工具的C库中。 C代码(我没有写)是复杂的低级别,通常在位级操作内存,并且只使用原始套接字。 应用程序是C端的multithreading(后台运行的pthread)以及Java端(ScheduledThreadPoolExecutors运行调用本机代码的线程)。 也就是说,C库应该基本稳定。 事实certificate,Java和JNI接口代码会导致问题。 问题 应用程序在进入本机C函数时崩溃并出现分段错误。 这仅在程序处于特定状态时才会发生(即,成功运行特定本机函数会导致下一次调用另一个特定本机函数进行段错误)。 此外,在发出quit命令时,应用程序会以类似的段错误崩溃,但同样,只有在成功运行相同的特定本机函数之后才会崩溃。 我是一个没有经验的C开发人员和经验丰富的Java开发人员 – 我习惯崩溃,给我一个特定的原因和一个特定的行号。 在这种情况下我需要做的就是hs_err_pid*.log输出和核心转储。 在这个问题的最后,我已经包含了我所能做的。 我的工作到目前为止 当然,我想找到发生崩溃的特定代码行。 我在Java端的本机调用之前放置了一个System.out.println()并且将printf()作为本机函数的第一行,程序崩溃后肯定会直接使用fflush(stdout) 。 System.out调用运行, printf调用没有。 这告诉我,在进入函数时发生了段错误 – 这是我以前从未见过的。 我将参数三重检查到函数,以确保它们不会起作用。 但是,我只传递一个参数(类型为jint )。 另外两个( JNIEnv *env, jobject j_object )是JNI构造,不受我的控制。 我注释掉了函数中的每一行,只留下了return 0; 在末尾。 段错误仍然发生。 这让我相信问题不在这个function中。 我以不同的顺序运行命令(有效地运行本机函数不同的命令)。 只有在崩溃函数调用之前运行一个特定的本机函数时才会发生段错误。 此特定function在运行时似乎表现正常。 我在另一个函数的末尾附近打印了env指针的值和&j_object的值,以确保我没有以某种方式破坏它们。 我不知道我是否损坏了它们,但是在退出函数时它们都具有非零值。 编辑1:通常,相同的函数在许multithreading中运行(通常不是并发的,但它应该是线程安全的)。 我从主线程运行该函数,而没有任何其他线程处于活动状态,以确保Java端的multithreading不会导致问题。 它不是,我得到了同样的段错误。 所有这一切都困扰着我。 如果我注释掉整个函数,除了return语句之外,为什么它仍然是段错误? 如果问题出现在另一个function中,为什么不在那里失败? 如果第一个函数弄乱内存并且第二个函数非法访问损坏的内存是一个问题,为什么不在非法访问的行上失败,而不是进入函数? 如果您看到一篇互联网文章,其中某人解释了与我类似的问题,请对其进行评论。 有很多段错误的文章,似乎都没有包含这个特定的问题。 对于SO问题同样如此。 […]

在C语言中嵌入Python – Segfault

从阅读另一篇文章 ,我试图在C中嵌入一些Python代码: main.c中 #include int callModuleFunc(int array[], size_t size) { PyObject *mymodule = PyImport_ImportModule(“py_function”); PyObject *myfunc = PyObject_GetAttrString(mymodule, “printlist”); PyObject *mylist = PyList_New(size); for (size_t i = 0; i != size; ++i) { PyList_SET_ITEM(mylist, i, PyInt_FromLong(array[i])); } PyObject *arglist = Py_BuildValue(“(o)”, mylist); PyObject *result = PyObject_CallObject(myfunc, arglist); int retval = (int)PyInt_AsLong(result); Py_DECREF(result); Py_DECREF(arglist); Py_DECREF(mylist); Py_DECREF(myfunc); […]

为什么我会出现段错误?

这是我的代码,我得到一个分段错误,我不知道为什么……我正在创建一个n是它的大小的网格, tab是一个数组,他的类型是cellule:一个单元格有2个值。 所以我在函数creer_grille创建了一个数组我malloc它(大小可以是4 6或8)并且我用-1和0初始化单元格值。然后在下面的函数中我正在测试creer_grille函数。 typedef struct { int val; int initial; } cellule; typedef struct { cellule *tab; int n; } grille; grille *creer_grille(int n) { grille *g; int i; assert(n == 4 || n == 6 || n == 8 && “Taille de la grille différent de 4,6 ou 8”); g->n = n; g […]

为什么程序有时会“跳过”printfs?

我有以下代码: if (!strcmp(ent_child->d_name, “eeprom”)){ printf(“\tread_from_driver: found a match! “);//DEBUG get_child_path(child_path, child_path, “eeprom”); printf(“The path is: %s\n”, child_path);//DEBUG read_eeprom(child_path); } 这会在某些时候导致段错误(可能是get_child_path),但是第一个printf永远不会发生,即使我将代码修改为: if (!strcmp(ent_child->d_name, “eeprom”)){ while(1) printf(“\tread_from_driver: found a match! “);//DEBUG get_child_path(child_path, child_path, “eeprom”); printf(“The path is: %s\n”, child_path);//DEBUG read_eeprom(child_path); } 它确实发生了。 这是怎么回事? 这绝对不是我第一次观察到这种行为。

使用fscanf读取指针时的分段错误(核心转储)

我正在尝试使用fscanf来读取和打印屏幕上的每个字符,但是当我运行程序时,我遇到了分段错误(核心转储)。 这是我的代码: #include main(int argc, char * argv[]) { int *a ; FILE *input; if (argc>=2) { input= fopen(argv[1],”r”); if (input!=NULL) { while (feof(input)==0) { fscanf(input,”%d\n”,a); printf(“%d\n”,*a); } fclose(input); } else { printf(“Error!\n”); } } } 我提供文件作为参数,如下所示: ./myprog input.txt 文件input.txt包含: 23 47 55 70

在简单的C代码中进行分段错误(核心转储)

我是C的新人。我指的是Brian W Kernighian和Dennis Ritchie所着的“C编程语言”一书。 本书中给出了一个指针增量和赋值的代码,如下所示。 #include int main() { char *s = “Goal”; char *t = “Home”; while(*s++ = *t++) printf(*s); return 0; } 使用该命令保存和编译代码 gcc ptr.c -o ptr -std=c99 现在通过运行命令运行代码 ./ptr 我收到以下错误 分段故障(核心转储) 错误似乎在while循环条件中。 但是代码与本书中给出的完全相同。 我错过了什么?

为什么我在初始化结构时会遇到段错误?

搜索了一个小时左右。 我想我最好在这里发布这个问题。 我简化了代码。 segfault位于函数initMyStruct 。 #include “stdlib.h” typedef struct { int * arr1; int * arr2; } myStruct; void allocMyStruct (myStruct * a, int num) { a = malloc(sizeof(myStruct)); a->arr1 = malloc(10*sizeof(int)); a->arr2 = malloc(10*num*sizeof(int)); } void initMyStruct (myStruct * a, int num) { int i; for (i = 0; i arr1[i] = 0; for […]

Android NDK分段错误

在我的应用程序中,当我尝试在那个时间面向分段错误时将我的日志打印到文件中。 我正面临致命信号11。 我的日志function是Native部分,我从Java调用它。 logcat的: 01-01 00:09:38.968: A/libc(3905): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1) 01-01 00:09:38.976: D/Random(2185): Trip In List :false 01-01 00:09:38.976: D/Random(2185): Odometer :0 01-01 00:09:38.976: D/abc(3905): PreCheck conditions satisfied for WIFI Searching Timer 01-01 00:09:39.601: I/DEBUG(1285): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** […]