好吧,这真的吓坏了我.我有一个以下函数,只读取输入并返回一个字符串
unsigned char* readFromIn() {
    unsigned char* text = malloc(1024);
    if (fgets(text,1024,stdin) != NULL) {          <--This is what's causing segmentation fault
        int textLen = strlen(text);
        if (textLen > 0 && text[textLen - 1] == '\n')
            text[textLen - 1] = '\0';     // getting rid of newline character
        return text;
    }
    else {
        free(text);
        return NULL;
    }
}

问题是,这个函数不会在任何地方被调用,只是为了确认,我将函数的名称更改为像9rawiohawr90awrhiokawrioawr这样的东西,并将printf语句放在函数的顶部.

我真的不确定为什么未调用的函数可能会导致分段错误错误.

我在ubuntu上使用gcc 4.6.3.

编辑:我知道那条线

if (fgets(text,stdin) != NULL) {

是有问题的代码,因为只要我注释掉条件,就不会发生分段错误.

我知道函数没有被调用,因为我没有看到我输出的printf调试语句的输出.

Edit2:我尝试将类型从unsigned char更改为char.仍然分段错误.我会尝试获取gdb输出.

Edit3:gdb backtrace产生了以下内容

#0 0xb7fa5ac2 in _IO_2_1_stdin_ () from /lib/i386-linux-gnu/libc.so.6
#1 0xb7faf2fb in libwebsocket_create_context (info=0xbffff280) at libwebsockets.c:2125
#2 0x0804a5bb in main()

做框架0,1,2特别没有输出任何有趣的东西.

编辑4:我已经尝试了评论中的所有建议,但无济于事,我仍然得到相同的分段错误.

所以我在虚拟操作系统上安装了一个新的Ubuntu副本并​​重新编译了我的代码.仍然出现同样的问题.
在我看来,问题在于我的代码或库本身是否存在一些模糊不清.我创建了一个演示问题的最小例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libwebsockets.h>


unsigned char* readFromIn() {
    unsigned char* text = malloc(1024);
    if (fgets(text,stdin) != NULL) { <--SEGMENTATION FAULT HERE
        int textLen = strlen(text);
        if (textLen > 0 && text[textLen - 1] == '\n')
            text[textLen - 1] = '\0';    
        return text;
    }
    else {
        free(text);
        return NULL;
    }
}

int callback_http(struct libwebsocket_context *context,struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,void *user,void *in,size_t len)
{
    return 0;
}

static struct libwebsocket_protocols protocols[] = {
    /* first protocol must always be HTTP handler */
    {
        "http-only",// name
        callback_http,// callback
        0              // per_session_data_size
    }
};

int main(void) {
    printf("Initializing Web Server\n");
        // server url will be http://localhost:8081
    int port = 8081;
    const char *interface = NULL;
    struct libwebsocket_context *context;
    // we're not using ssl
    const char *cert_path = NULL;
    const char *key_path = NULL;
    // no special options
    int opts = 0;


    struct lws_context_creation_info info;

    memset(&info,sizeof info);
    info.port = port;
    info.iface = interface;
    info.protocols = protocols;
    info.extensions = libwebsocket_get_internal_extensions();
    info.ssl_cert_filepath = NULL;
    info.ssl_private_key_filepath = NULL;
    info.gid = -1;
    info.uid = -1;
    info.options = opts;

    context = libwebsocket_create_context(&info);
    if (context == NULL) {
        fprintf(stderr,"libwebsocket init Failed\n");
        return 0;
    }

    printf("starting server...\n");

    while (1) {
        libwebsocket_service(context,50);
    }
    printf("Shutting server down...\n");
    libwebsocket_context_destroy(context);

    return 0;
}

这是我编译代码的方式

gcc -g testbug.c -o test -lwebsockets

这是我正在使用的库

http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/tag/?id=v1.23-chrome32-firefox24

您将看到我没有调用函数readFromIn(),一旦您尝试运行可执行文件就会发生分段错误.

我重新运行gdb,这次,回溯和帧告诉我更多的信息.

(gdb) run
Starting program: /home/l46kok/Desktop/websocketserver/test 
Initializing Web Server
[1384002761:2270] NOTICE: Initial logging level 7
[1384002761:2270] NOTICE: Library version: 1.3 unkNown-build-hash
[1384002761:2271] NOTICE:  Started with daemon pid 0
[1384002761:2271] NOTICE:  static allocation: 4448 + (12 x 1024 fds) = 16736 bytes
[1384002761:2271] NOTICE:  canonical_hostname = ubuntu
[1384002761:2271] NOTICE:  Compiled with OpenSSL support
[1384002761:2271] NOTICE:  Using non-SSL mode
[1384002761:2271] NOTICE:  per-conn mem: 124 + 1360 headers + protocol rx buf
[1384002761:2294] NOTICE:  Listening on port 8081

Program received signal SIGSEGV,Segmentation fault.
0xb7fb1ac0 in _IO_2_1_stdin_ () from /lib/i386-linux-gnu/libc.so.6
(gdb) backtrace
#0  0xb7fb1ac0 in _IO_2_1_stdin_ () from /lib/i386-linux-gnu/libc.so.6
#1  0xb7fcc2c6 in libwebsocket_create_context () from /usr/local/lib/libwebsockets.so.4.0.0
#2  0x080488c4 in main () at testbug.c:483
(gdb) frame 1
#1  0xb7fcc2c6 in libwebsocket_create_context () from /usr/local/lib/libwebsockets.so.4.0.0
(gdb) frame 2
#2  0x080488c4 in main () at testbug.c:483
483         context = libwebsocket_create_context(&info);

所以是啊..我想我已经提供了所有信息……但我真的不确定问题是什么.该程序在第483行导致分段错误,但当我注释掉未被调用的有问题的函数时问题就消失了.

解决方法

可能你在初始化libwebsockets时遗漏了一些东西.

实际上,使用调试重新编译libwebsockets表明:

GNU gdb (GDB) 7.6.1 (Debian 7.6.1-1)
copyright (C) 2013 Free Software Foundation,Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY,to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions,please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/vili/x...done.
(gdb) r
Starting program: /home/vili/./x
warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?
Initializing Web Server
[1384020141:5692] NOTICE: Initial logging level 7
[1384020141:5692] NOTICE: Library version: 1.2
[1384020141:5693] NOTICE:  Started with daemon pid 0
[1384020141:5693] NOTICE:  static allocation: 5512 + (16 x 1024 fds) = 21896 bytes
[1384020141:5693] NOTICE:  canonical_hostname = x220
[1384020141:5693] NOTICE:  Compiled with OpenSSL support
[1384020141:5693] NOTICE:  Using non-SSL mode
[1384020141:5693] NOTICE:  per-conn mem: 248 + 1328 headers + protocol rx buf
[1384020141:5713] NOTICE:  Listening on port 8081

Program received signal SIGSEGV,Segmentation fault.
0x00007ffff7bc2080 in _IO_2_1_stderr_ () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) bt
#0  0x00007ffff7bc2080 in _IO_2_1_stderr_ () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff7bcd83c in libwebsocket_create_context (info=0x7fffffffe580)
    at libwebsockets.c:2093
#2  0x0000000000400918 in main () at x.c:66
(gdb) up
#1  0x00007ffff7bcd83c in libwebsocket_create_context (info=0x7fffffffe580)
    at libwebsockets.c:2093
2093                    info->protocols[context->count_protocols].callback(context,(gdb) p context->count_protocols
$1 = 1
(gdb) p info->protocols[1]
$2 = {
  name = 0x7ffff7bc2240 <_IO_2_1_stdin_> "\210 \255",<incomplete sequence \373>,callback = 0x7ffff7bc2080 <_IO_2_1_stderr_>,per_session_data_size = 140737349689696,rx_buffer_size = 0,owning_server = 0x602010,protocol_index = 1}
(gdb)

您可能需要使用特殊条目(NULL)关闭libwebsocket_protocols数组,以便lib知道它通过info->协议获得了多少条目.

编辑:是的,检查文档:http://jsk.pp.ua/knowledge/libwebsocket.html

Array of structures listing supported protocols and a protocol- specific callback for each one. The list is ended with an entry that has a NULL callback pointer.

来自根本未调用的函数的分段错误的更多相关文章

  1. ios – 仅在异步函数完成执行后运行代码

    所以,例如:如果问题是你不知道要调用什么函数,你可以配置你周围的函数/对象,这样有人可以给你一个函数,然后你在我上面说“调用函数”的地方调用你的函数.例如:

  2. ios – 如何使用Objective C类中的多个参数调用Swift函数?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  3. iOS 7,用于断开调用的私有API CTCallDisconnect不起作用

    谢谢!

  4. ios – 监控CBPeripheral状态变化

    我在CoreBluetooth库中找不到任何暴露的东西,我想在CBperipheralstate发生变化时调用一个函数.现在我只有一个switch语句来检查外设状态,但它总是只返回连接或断开连接.我如何进入连接/断开连接的情况?

  5. ios – Xcode游乐场不执行功能

    我创建了一个新的游乐场,我添加了简单的功能,但该功能从未被调用过:你们中的任何人都知道为什么函数没有被调用?我真的很感谢你的帮助解决方法因为你没有调用该函数.只需称呼它:

  6. ios – Swift中没有输入参数的通用函数?

    我有一个通用的Swift函数,如下所示:编译器没有错误,但我不知道如何调用此函数.我试过了:但它不起作用.如何在没有输入参数的情况下在Swift中调用Generic函数?解决方法你需要通过一些调用上下文告诉Swift返回类型是什么:注意,在后一种情况下,只有当someCall采用类似于Any的模糊类型作为其参数时,才需要这样做.相反,someCall被指定为[Int]作为参数,函数本身提供上下文,你可以只写someCall事实上,有时可以非常推断出背景!

  7. ios – UISearch栏没有调用searchBarTextDidBeginEditing

    EDITING2:真奇怪的行为:将IBAction函数设置为UITextfield的TouchDown事件可以很好地工作,但将IBAction函数设置为EditingDidBegin永远不会被触发…

  8. ios – Swift:如何从不同的swift文件中调用函数

    我的Xcode6beta-2项目中有多个类型为UIViewController的swift文件.我基本上想知道文件A中的一些数据在文件B中使用.我的文件都是UIViewControllers,我创建了一个没有参数的函数,它返回UIViewController_A中的字符串.当我尝试在UIViewController_B中调用所述函数时,intellisense为我填写,但是我必须有一个自动填充为U

  9. 更改Xcode中的工作目录

    我设法使用cmake-GXcode在Xcode中运行C项目.现在我想调试它,因为它提供了很好的gdb.但是,我需要更改gdb执行的工作目录,否则它将无法工作.我可以做的是在gdb停止键入cdworking_dir之后,然后手动输入r.这是有效的,但Xcode将不断投诉,也不是一个优雅的解决方案.所以在构建设置的某个地方我应该能够设置工作目录.但在哪里?解决方法在Xcode中,在可执行文件上执行“获取信息”,并查看第一个选项卡–有一个工作目录的设置.

  10. 如何检测用户在iOS上授予麦克风权限?

    所以我需要在用户给出(或拒绝)使用麦克风的权限后调用某个函数.我已经看到了这个:但是,这仅用于检测当前状态.如果当前状态为“no”并且弹出窗口显示且用户提供权限–则不会调用该函数.那是因为在执行此操作的那一刻,权限是“否”,直到我们下次运行代码时才会调用该函数.我想要做的是在用户按下“允许”或“拒绝”后调用一个函数.谁知道怎么做?

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&amp;GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部