首页 > 解决方案 > 访问向量的段错误共享库中填充的对象

问题描述

我创建了一个共享库,它只是用来自 c++ 程序的一些硬编码值填充传递的对象。

在访问作为向量的对象数据成员时,我遇到了分段错误,如果我不访问该元素,当对象被破坏时,我仍然会遇到分段错误。

让我知道是否需要与 g++ 构建版本或共享库构建版本相关的任何其他信息来缩小问题范围。

添加更多信息我有两台机器都是ubuntu

此代码适用于机器 1

temp@ubuntu:~/c++$ uname -a
Linux ubuntu 4.4.0-186-generic #216-Ubuntu SMP Wed Jul 1 05:34:05 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
temp@ubuntu:~/c++$ ./a.out
10.15.29.40
10.15.29.41
10.15.29.51
hostname4
temp@ubuntu:~/c++$

机器 2 在这台机器上不起作用的地方

temp@ubuntu16:~$ uname -a
Linux ubuntu16 4.4.0-131-generic #157-Ubuntu SMP Thu Jul 12 15:51:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
temp@ubuntu16:~$ g++ -v
and the output I have mentione of a.out below

共享库代码

#include <filter.h> // has decleration of class Filter
#ifdef __cplusplus
extern "C" {
#endif

     int GetFilter(const char* appCtx, Filter& filter)
    {
        int error = -1;
        int success = 0;

        filter.a= 10;
        filter.b= 1;
        filter.c= 13;
        filter.d= 524319;
        filter.hostnames.push_back("10.15.29.40");
        filter.hostnames.push_back("10.15.29.41");
        filter.hostnames.push_back("10.15.29.51");
        filter.hostnames.push_back("hostname4");
        return success;
    }

#ifdef __cplusplus
}
#endif

C++ 程序

    #include <iostream>
#include <vector>
#include <string>
#include <stdint.h>

using namespace std;
// instead of declearing class here filter.h can also be added

class Filter{
public:
    vector<string> hostnames;
    uint32_t a;
    uint64_t b;
    uint64_t c;
    uint64_t d;

};

extern "C" {
int GetFilter(const char* name, Filter& filter);
}

int main() {
        Filter temp;
        GetFilter("arya" , temp);
        cout<<temp.hostnames.size()<<endl;
        for(int i=0;i<temp.hostnames.size();++i){
               cout<<temp.hostnames[i]<<endl;
        }

        return 0;
}

./a.out 输出

1   /// <<--- how come size is one??
10.15.29.40!@⚌⚌⚌{W> 0

                     10.15.29.41!⚌{W>⚌⚌ 0

                                         10.15.29.511⚌⚌8⚌⚌⚌⚌⚌⚌⚌1                hostname410.15.29.40!@⚌⚌⚌{W> 0

                                                                                                              10.15.29.41!⚌{W>⚌⚌ 0

                                                                                                                                  10.15.29.511⚌⚌8⚌⚌⚌⚌⚌⚌⚌1    hostname410.15.29.40!@⚌⚌⚌{W> 0

                             10.15.29.41!⚌{W>⚌⚌ 0

                                                 10.15.29.511⚌⚌8⚌⚌⚌⚌⚌⚌⚌1                hostname410.15.29.40!@⚌⚌⚌{W> 0

                                                                                                                      10.15.29.41!⚌{W>⚌⚌ 0

                                                                                                                                          10.15.29.511⚌⚌8⚌⚌⚌⚌⚌⚌⚌1             hostname410.15.29.40!@⚌⚌⚌{W> 0

                                              10.15.29.41!⚌{W>⚌⚌ 0

                                                                  10.15.29.511⚌*** Error in `./a.out': free(): invalid pointer: 0x0000000000de9de8 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777f5)[0x7f5d3e22a7f5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8038a)[0x7f5d3e23338a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f5d3e23758c]
./a.out[0x4010f1]
./a.out[0x401091]
./a.out[0x40100a]
./a.out[0x400f55]
./a.out[0x400e00]
./a.out[0x400daa]
./a.out[0x400cea]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f5d3e1d3840]
./a.out[0x400b59]
======= Memory map: ========
00400000-00402000 r-xp 00000000 fc:00 272871                             /home/virsec/aryaman/a.out
00601000-00602000 r--p 00001000 fc:00 272871                             /home/virsec/aryaman/a.out
00602000-00603000 rw-p 00002000 fc:00 272871                             /home/virsec/aryaman/a.out
00dd8000-00e0a000 rw-p 00000000 00:00 0                                  [heap]
7f5d38000000-7f5d38021000 rw-p 00000000 00:00 0
7f5d38021000-7f5d3c000000 ---p 00000000 00:00 0
7f5d3deaa000-7f5d3dfb2000 r-xp 00000000 fc:00 2753021                    /lib/x86_64-linux-gnu/libm-2.23.so
7f5d3dfb2000-7f5d3e1b1000 ---p 00108000 fc:00 2753021                    /lib/x86_64-linux-gnu/libm-2.23.so
7f5d3e1b1000-7f5d3e1b2000 r--p 00107000 fc:00 2753021                    /lib/x86_64-linux-gnu/libm-2.23.so
7f5d3e1b2000-7f5d3e1b3000 rw-p 00108000 fc:00 2753021                    /lib/x86_64-linux-gnu/libm-2.23.so
7f5d3e1b3000-7f5d3e373000 r-xp 00000000 fc:00 2752999                    /lib/x86_64-linux-gnu/libc-2.23.so
7f5d3e373000-7f5d3e573000 ---p 001c0000 fc:00 2752999                    /lib/x86_64-linux-gnu/libc-2.23.so
7f5d3e573000-7f5d3e577000 r--p 001c0000 fc:00 2752999                    /lib/x86_64-linux-gnu/libc-2.23.so
7f5d3e577000-7f5d3e579000 rw-p 001c4000 fc:00 2752999                    /lib/x86_64-linux-gnu/libc-2.23.so
7f5d3e579000-7f5d3e57d000 rw-p 00000000 00:00 0
7f5d3e57d000-7f5d3e593000 r-xp 00000000 fc:00 2753039                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f5d3e593000-7f5d3e792000 ---p 00016000 fc:00 2753039                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f5d3e792000-7f5d3e793000 rw-p 00015000 fc:00 2753039                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7f5d3e793000-7f5d3e905000 r-xp 00000000 fc:00 1572889                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f5d3e905000-7f5d3eb05000 ---p 00172000 fc:00 1572889                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f5d3eb05000-7f5d3eb0f000 r--p 00172000 fc:00 1572889                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f5d3eb0f000-7f5d3eb11000 rw-p 0017c000 fc:00 1572889                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f5d3eb11000-7f5d3eb15000 rw-p 00000000 00:00 0
7f5d3eb15000-7f5d3eb2a000 r-xp 00000000 fc:00 2753533                    /usr/local/openresty/nginx/libIAE-Assist.so
7f5d3eb2a000-7f5d3ed29000 ---p 00015000 fc:00 2753533                    /usr/local/openresty/nginx/libIAE-Assist.so
7f5d3ed29000-7f5d3ed2a000 r--p 00014000 fc:00 2753533                    /usr/local/openresty/nginx/libIAE-Assist.so
7f5d3ed2a000-7f5d3ed2b000 rw-p 00015000 fc:00 2753533                    /usr/local/openresty/nginx/libIAE-Assist.so
7f5d3ed2b000-7f5d3ed51000 r-xp 00000000 fc:00 2753071                    /lib/x86_64-linux-gnu/ld-2.23.so
7f5d3ef42000-7f5d3ef48000 rw-p 00000000 00:00 0
7f5d3ef4f000-7f5d3ef50000 rw-p 00000000 00:00 0
7f5d3ef50000-7f5d3ef51000 r--p 00025000 fc:00 2753071                    /lib/x86_64-linux-gnu/ld-2.23.so
7f5d3ef51000-7f5d3ef52000 rw-p 00026000 fc:00 2753071                    /lib/x86_64-linux-gnu/ld-2.23.so
7f5d3ef52000-7f5d3ef53000 rw-p 00000000 00:00 0
7ffe6034f000-7ffe60370000 rw-p 00000000 00:00 0                          [stack]
7ffe603c5000-7ffe603c8000 r--p 00000000 00:00 0                          [vvar]
7ffe603c8000-7ffe603ca000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted (core dumped)

标签: c++vectorstl

解决方案


推荐阅读