LINUX.ORG.RU

Причина Ошибки сегментирования


0

2

Помогите понять причину возникновения ошибки сегментирования.

$ cat libmatrix.c 
void ones_matrix( 
const int n, 
const int m, 
double*   mtx) 
{
   for(int i=0; i<n; ++i)
       for(int j=0; j<m; ++j)
                  *(mtx++)=(i+j)/2.;
}

$ cat matrix.py
#!/usr/bin/python
from os import path
from sys import platform
path = path.dirname(path.realpath(__file__))
if 'linux' in platform:
    mod_matrix_maker=cdll.LoadLibrary("%s/libmatrix.so" % path)

def myones(n,m):
    A=ndarray((n,m),dtype='d')
    mod_matrix_maker.ones_matrix(n,m,A.reshape(-1,1).ctypes.data)
    return A

$ cat test.py 
#!/usr/bin/python
import ctypes
from sys import path
path.append('./../')
from module.matrix import *
A = myones(1000,200)
print A

$ ./test.py 
Ошибка сегментирования
$ gdb --args python ./test.py 
GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08
Copyright (C) 2011 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://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /usr/bin/python...(no debugging symbols found)...done.
(gdb) run
Starting program: /usr/bin/python ./test.py
[Thread debugging using libthread_db enabled]

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff347b5e2 in ones_matrix (n=1000, m=200, mtx=0xf32f4010) at libmatrix.c:11
11	                  *(mtx++)=(i+j)/2.;
(gdb)  bt full
#0  0x00007ffff347b5e2 in ones_matrix (n=1000, m=200, mtx=0xf32f4010) at libmatrix.c:11
        j = 0
        i = 0
#1  0x00007ffff6377d54 in ffi_call_unix64 () from /usr/lib/python2.7/lib-dynload/_ctypes.so
No symbol table info available.
#2  0x00007ffff6377775 in ffi_call () from /usr/lib/python2.7/lib-dynload/_ctypes.so
No symbol table info available.
#3  0x00007ffff636fef7 in _ctypes_callproc () from /usr/lib/python2.7/lib-dynload/_ctypes.so
No symbol table info available.
#4  0x00007ffff63675f7 in ?? () from /usr/lib/python2.7/lib-dynload/_ctypes.so
No symbol table info available.
#5  0x000000000041ad2a in PyObject_Call ()
No symbol table info available.
#6  0x00000000004b6b9e in PyEval_EvalFrameEx ()
No symbol table info available.
#7  0x00000000004b6d77 in PyEval_EvalFrameEx ()
No symbol table info available.
#8  0x00000000004bcd2d in PyEval_EvalCodeEx ()
No symbol table info available.
#9  0x00000000004bd802 in PyEval_EvalCode ()
No symbol table info available.
#10 0x00000000004dcc22 in ?? ()
No symbol table info available.
#11 0x00000000004dd7e4 in PyRun_FileExFlags ()
No symbol table info available.
#12 0x00000000004de2ee in PyRun_SimpleFileExFlags ()
No symbol table info available.
#13 0x00000000004ee6dd in Py_Main ()
---Type <return> to continue, or q <return> to quit---
No symbol table info available.
#14 0x00007ffff699e30d in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
No symbol table info available.
#15 0x000000000041cb69 in _start ()
No symbol table info available.

Когда вывалится в gdb, покажи pmap -d <pid>, где pid - питонячий процесс, вызвавший сишную функцию.

mv ★★★★★
()
Ответ на: комментарий от mv
$ pmap -d 2208
2208:   /usr/bin/python ./test.py
Address           Kbytes Mode  Offset           Device    Mapping
0000000000400000    2252 r-x-- 0000000000000000 0fd:00000 python2.7
0000000000832000       4 r---- 0000000000232000 0fd:00000 python2.7
0000000000833000     420 rw--- 0000000000233000 0fd:00000 python2.7
000000000089c000    5184 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff3336000    1564 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff34bd000       4 r-x-- 0000000000000000 0fd:00002 libmatrix.so
00007ffff34be000    2044 ----- 0000000000001000 0fd:00002 libmatrix.so
00007ffff36bd000       4 r---- 0000000000000000 0fd:00002 libmatrix.so
00007ffff36be000       4 rw--- 0000000000001000 0fd:00002 libmatrix.so
00007ffff36bf000     292 r-x-- 0000000000000000 0fd:00000 mtrand.so
00007ffff3708000    2048 ----- 0000000000049000 0fd:00000 mtrand.so
00007ffff3908000       4 r---- 0000000000049000 0fd:00000 mtrand.so
00007ffff3909000     112 rw--- 000000000004a000 0fd:00000 mtrand.so
00007ffff3925000       4 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff3926000      36 r-x-- 0000000000000000 0fd:00000 fftpack_lite.so
00007ffff392f000    2044 ----- 0000000000009000 0fd:00000 fftpack_lite.so
00007ffff3b2e000       4 r---- 0000000000008000 0fd:00000 fftpack_lite.so
00007ffff3b2f000       4 rw--- 0000000000009000 0fd:00000 fftpack_lite.so
00007ffff3b30000     212 r-x-- 0000000000000000 0fd:00000 libquadmath.so.0.0.0
00007ffff3b65000    2044 ----- 0000000000035000 0fd:00000 libquadmath.so.0.0.0
00007ffff3d64000       4 r---- 0000000000034000 0fd:00000 libquadmath.so.0.0.0
00007ffff3d65000       4 rw--- 0000000000035000 0fd:00000 libquadmath.so.0.0.0
00007ffff3d66000      84 r-x-- 0000000000000000 0fd:00000 libgcc_s.so.1
00007ffff3d7b000    2044 ----- 0000000000015000 0fd:00000 libgcc_s.so.1
00007ffff3f7a000       4 r---- 0000000000014000 0fd:00000 libgcc_s.so.1
00007ffff3f7b000       4 rw--- 0000000000015000 0fd:00000 libgcc_s.so.1
00007ffff3f7c000    1104 r-x-- 0000000000000000 0fd:00000 libgfortran.so.3.0.0
00007ffff4090000    2044 ----- 0000000000114000 0fd:00000 libgfortran.so.3.0.0
00007ffff428f000       4 r---- 0000000000113000 0fd:00000 libgfortran.so.3.0.0
00007ffff4290000       8 rw--- 0000000000114000 0fd:00000 libgfortran.so.3.0.0
00007ffff4292000    9108 r-x-- 0000000000000000 0fd:00000 liblapack.so.3gf.0
00007ffff4b77000    2044 ----- 00000000008e5000 0fd:00000 liblapack.so.3gf.0
00007ffff4d76000       4 r---- 00000000008e4000 0fd:00000 liblapack.so.3gf.0
00007ffff4d77000      16 rw--- 00000000008e5000 0fd:00000 liblapack.so.3gf.0
00007ffff4d7b000    1076 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff4e88000      20 r-x-- 0000000000000000 0fd:00000 lapack_lite.so
00007ffff4e8d000    2048 ----- 0000000000005000 0fd:00000 lapack_lite.so
00007ffff508d000       4 r---- 0000000000005000 0fd:00000 lapack_lite.so
00007ffff508e000       4 rw--- 0000000000006000 0fd:00000 lapack_lite.so
00007ffff508f000      16 r-x-- 0000000000000000 0fd:00000 _compiled_base.so
00007ffff5093000    2044 ----- 0000000000004000 0fd:00000 _compiled_base.so
00007ffff5292000       4 r---- 0000000000003000 0fd:00000 _compiled_base.so
00007ffff5293000       4 rw--- 0000000000004000 0fd:00000 _compiled_base.so
00007ffff5294000     772 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff5355000      12 r-x-- 0000000000000000 0fd:00000 _heapq.so
00007ffff5358000    2044 ----- 0000000000003000 0fd:00000 _heapq.so
00007ffff5557000       4 r---- 0000000000002000 0fd:00000 _heapq.so
00007ffff5558000       8 rw--- 0000000000003000 0fd:00000 _heapq.so
00007ffff555a000     260 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff559b000     152 r-x-- 0000000000000000 0fd:00000 scalarmath.so

nindza
() автор топика
Ответ на: комментарий от mv
00007ffff55c1000    2044 ----- 0000000000026000 0fd:00000 scalarmath.so
00007ffff57c0000       4 r---- 0000000000025000 0fd:00000 scalarmath.so
00007ffff57c1000       8 rw--- 0000000000026000 0fd:00000 scalarmath.so
00007ffff57c3000     612 r-x-- 0000000000000000 0fd:00000 libblas.so.3gf.0
00007ffff585c000    2044 ----- 0000000000099000 0fd:00000 libblas.so.3gf.0
00007ffff5a5b000       4 r---- 0000000000098000 0fd:00000 libblas.so.3gf.0
00007ffff5a5c000       4 rw--- 0000000000099000 0fd:00000 libblas.so.3gf.0
00007ffff5a5d000      20 r-x-- 0000000000000000 0fd:00000 _dotblas.so
00007ffff5a62000    2044 ----- 0000000000005000 0fd:00000 _dotblas.so
00007ffff5c61000       4 r---- 0000000000004000 0fd:00000 _dotblas.so
00007ffff5c62000       4 rw--- 0000000000005000 0fd:00000 _dotblas.so
00007ffff5c63000      84 r-x-- 0000000000000000 0fd:00000 _sort.so
00007ffff5c78000    2044 ----- 0000000000015000 0fd:00000 _sort.so
00007ffff5e77000       4 r---- 0000000000014000 0fd:00000 _sort.so
00007ffff5e78000       4 rw--- 0000000000015000 0fd:00000 _sort.so
00007ffff5e79000     304 r-x-- 0000000000000000 0fd:00000 umath.so
00007ffff5ec5000    2044 ----- 000000000004c000 0fd:00000 umath.so
00007ffff60c4000       4 r---- 000000000004b000 0fd:00000 umath.so
00007ffff60c5000      16 rw--- 000000000004c000 0fd:00000 umath.so
00007ffff60c9000       8 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff60cb000     536 r-x-- 0000000000000000 0fd:00000 multiarray.so
00007ffff6151000    2044 ----- 0000000000086000 0fd:00000 multiarray.so
00007ffff6350000       4 r---- 0000000000085000 0fd:00000 multiarray.so
00007ffff6351000      44 rw--- 0000000000086000 0fd:00000 multiarray.so
00007ffff635c000       8 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff635e000     124 r-x-- 0000000000000000 0fd:00000 _ctypes.so
00007ffff637d000    2048 ----- 000000000001f000 0fd:00000 _ctypes.so
00007ffff657d000       4 r---- 000000000001f000 0fd:00000 _ctypes.so
00007ffff657e000      16 rw--- 0000000000020000 0fd:00000 _ctypes.so
00007ffff6582000       4 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff6583000    4072 r---- 0000000000000000 0fd:00000 locale-archive
00007ffff697d000    1620 r-x-- 0000000000000000 0fd:00000 libc-2.13.so
00007ffff6b12000    2044 ----- 0000000000195000 0fd:00000 libc-2.13.so
00007ffff6d11000      16 r---- 0000000000194000 0fd:00000 libc-2.13.so
00007ffff6d15000       4 rw--- 0000000000198000 0fd:00000 libc-2.13.so
00007ffff6d16000      24 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff6d1c000     524 r-x-- 0000000000000000 0fd:00000 libm-2.13.so
00007ffff6d9f000    2044 ----- 0000000000083000 0fd:00000 libm-2.13.so
00007ffff6f9e000       4 r---- 0000000000082000 0fd:00000 libm-2.13.so
00007ffff6f9f000       4 rw--- 0000000000083000 0fd:00000 libm-2.13.so
00007ffff6fa0000      92 r-x-- 0000000000000000 0fd:00000 libz.so.1.2.3.4
00007ffff6fb7000    2044 ----- 0000000000017000 0fd:00000 libz.so.1.2.3.4
00007ffff71b6000       4 r---- 0000000000016000 0fd:00000 libz.so.1.2.3.4
00007ffff71b7000       4 rw--- 0000000000017000 0fd:00000 libz.so.1.2.3.4
00007ffff71b8000    1568 r-x-- 0000000000000000 0fd:00000 libcrypto.so.1.0.0
00007ffff7340000    2048 ----- 0000000000188000 0fd:00000 libcrypto.so.1.0.0
00007ffff7540000     100 r---- 0000000000188000 0fd:00000 libcrypto.so.1.0.0
00007ffff7559000      40 rw--- 00000000001a1000 0fd:00000 libcrypto.so.1.0.0
00007ffff7563000      16 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff7567000     296 r-x-- 0000000000000000 0fd:00000 libssl.so.1.0.0
00007ffff75b1000    2044 ----- 000000000004a000 0fd:00000 libssl.so.1.0.0
00007ffff77b0000      12 r---- 0000000000049000 0fd:00000 libssl.so.1.0.0
00007ffff77b3000      20 rw--- 000000000004c000 0fd:00000 libssl.so.1.0.0
00007ffff77b8000       8 r-x-- 0000000000000000 0fd:00000 libutil-2.13.so
00007ffff77ba000    2044 ----- 0000000000002000 0fd:00000 libutil-2.13.so
00007ffff79b9000       4 r---- 0000000000001000 0fd:00000 libutil-2.13.so
00007ffff79ba000       4 rw--- 0000000000002000 0fd:00000 libutil-2.13.so
00007ffff79bb000       8 r-x-- 0000000000000000 0fd:00000 libdl-2.13.so
00007ffff79bd000    2048 ----- 0000000000002000 0fd:00000 libdl-2.13.so
00007ffff7bbd000       4 r---- 0000000000002000 0fd:00000 libdl-2.13.so
00007ffff7bbe000       4 rw--- 0000000000003000 0fd:00000 libdl-2.13.so
00007ffff7bbf000      96 r-x-- 0000000000000000 0fd:00000 libpthread-2.13.so
00007ffff7bd7000    2044 ----- 0000000000018000 0fd:00000 libpthread-2.13.so
00007ffff7dd6000       4 r---- 0000000000017000 0fd:00000 libpthread-2.13.so
00007ffff7dd7000       4 rw--- 0000000000018000 0fd:00000 libpthread-2.13.so
00007ffff7dd8000      16 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff7ddc000     132 r-x-- 0000000000000000 0fd:00000 ld-2.13.so
00007ffff7e1c000     260 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff7e5d000       4 rwx-- 0000000000000000 000:00000   [ anon ]
00007ffff7e5e000     780 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff7f53000     540 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff7ff8000      12 rw--- 0000000000000000 000:00000   [ anon ]
00007ffff7ffb000       4 r-x-- 0000000000000000 000:00000   [ anon ]
00007ffff7ffc000       4 r---- 0000000000020000 0fd:00000 ld-2.13.so
00007ffff7ffd000       8 rw--- 0000000000021000 0fd:00000 ld-2.13.so
00007ffffffcc000     204 rw--- 0000000000000000 000:00000   [ stack ]
ffffffffff600000       4 r-x-- 0000000000000000 000:00000   [ anon ]
mapped: 86252K    writeable/private: 11512K    shared: 0K

nindza
() автор топика
Ответ на: комментарий от mv
$ gdb -arg python ./test.py 
GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08
Copyright (C) 2011 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://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /usr/bin/python...(no debugging symbols found)...done.
(gdb) run
Starting program: /usr/bin/python ./test.py
[Thread debugging using libthread_db enabled]
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff34bd5e2 in ones_matrix (n=1000, m=200, mtx=0xf3336010) at libmatrix.c:11
11	                  *(mtx++)=(i+j)/2.;
nindza
() автор топика
Ответ на: комментарий от nindza

0x00007ffff34bd5e2 in ones_matrix (n=1000, m=200, mtx=0xf3336010) at libmatrix.c:11

Памяти по адресу 0xf3336010 никакой нет, поэтому segmentation fault. Но у тебя в твоей 64-битной системе где-то режется указатель при передаче в сишный модуль. Указатель на самом деле должен быть 0x7ffff3336010 и попадать в сегмент:

00007ffff3336000 1564 rw--- 0000000000000000 000:00000 [ anon ]

Библиотеку как собирал?

mv ★★★★★
()
Ответ на: комментарий от nindza

на маленьких массивах, типа 100x100 или 200x200 все работает

Ну так ты указатель смотри, какой передаётся.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.