hack のためのネタ帳, etc,,,

以下は作業記録
Debian - PHP/ext/pdo_oci (20100721) の続き

20100722 gdb による観察

とりあえず問題の出るテーブルに以下のように SELECT かけるコード書いた
pdo_oci_test.php
<?php
$db = new PDO("oci:dbname=//servername/servicename", "user", "password");
$db->beginTransaction();
$sth = $db->prepare("SELECT * FROM tablename");
$sth->execute();

$numrows = 0;
while ($row = $sth->fetch()) {
    echo "----------------------------------------------------------------\n";
    echo $numrows++ . "\n";
    //var_dump($row);
}
これを gdb 経由で CLI から叩く
% gdb php
(gdb) run pdo_oci_test.php
... 中略
OCI-21500: internal error code, arguments: [kohfrm771], [], [], [], [], [], [], []
Errors in file :
OCI-21500: internal error code, arguments: [kohfrm771], [], [], [], [], [], [], []
... 中略

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb77dc6d0 (LWP 18626)]
0xb6ed0cb8 in slrac ()
   from /usr/lib/oracle/xe/app/oracle/product/10.2.0/client//lib/libclntsh.so.10.1
(gdb) 
ぎゃふん
oracle-xe-client のランタイム内で seg ってのはどうすりゃ良いのよ(T T)
しかも backtrace が効かない
php5-dev 入れてみたり
pdo_oci ビルドする再に
# export DEB_BUILD_OPTIONS=debug,nostrip
とかやってみたけど効果なし

ところが sqlplus から
SQL> SELECT * FROM tablename;
ってすると普通に通る
これは条件は同じのはずである
ってことは pdo_oci が libclntsh.so の API 呼ぶときにパラメータ渡し損なってるのか???

slrac() で落ちてるって事例では
Bug #28449 Apache 2 crash when executes OCIFetchInto
とか近いけどOCI-21590の第1パラメータが違う
長いカラムにfetchかけれないってバグだったのでサーバーにパッチ当てたら動いたってコメントしてる人がいるけど、
当該の bug report とパッチが見つからない罠
それにうちの環境、サーバーは触れない(つ ;)

最新安定版で再パッケージ化

最新の安定版 PHP-5.3.4 のソースを拾ってきて
dh-make-pecl でパッケージ化したが効果なし

Oracle Database Instant Client 11.2 のインストール

Oracle Database Instant Client だと
最新の 11gR2 が使えそうな雰囲気
ただし zip で階層が適当なので、階層組み直すことが必要。
あとできれば私家 .deb にしておく方が吉。
ということで alien で転がす。

とりあえず
Instant Client for Linux x86
から Basic, SQL*Plus, SDK, ODBC を拾ってきたら
/tmp 辺りに移動しておく。

あとは以下の処理を流す
unzip instantclient-basic-linux32-11.2.0.1.zip 
unzip instantclient-sqlplus-linux32-11.2.0.1.zip 
unzip instantclient-sdk-linux32-11.2.0.1.zip 
unzip instantclient-odbc-linux32-11.2.0.1.zip 

mkdir -p usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/bin/
mkdir -p usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/
mkdir -p usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/jdbc/lib/
mkdir -p usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/odbc/html/
mkdir -p usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/odbc/util/
mkdir -p usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/sqlplus
mkdir -p usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/rdbms/public/
mkdir -p usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/rdbms/demo/
mkdir -p usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/precomp/lib/
mkdir -p usr/share/doc/oracle-instant-client/
mkdir -p etc/ld.so.conf.d/

mv instantclient_11_2/adrci              usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/bin/
mv instantclient_11_2/genezi             usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/bin/
mv instantclient_11_2/sqlplus            usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/bin/
mv instantclient_11_2/sdk/ott            usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/bin/
mv instantclient_11_2/*.so*              usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/
mv instantclient_11_2/ODBC*.htm*         usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/odbc/html/
mv instantclient_11_2/odbc*.sh           usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/odbc/util/
mv instantclient_11_2/*.jar              usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/jdbc/lib/
mv instantclient_11_2/*.sql              usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/sqlplus/
mv instantclient_11_2/sdk/demo           usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/rdbms/
mv instantclient_11_2/sdk/include/*      usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/rdbms/public/
mv instantclient_11_2/sdk/ottclasses.zip usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/precomp/lib/
mv instantclient_11_2/*README            usr/share/doc/oracle-instant-client/
mv instantclient_11_2/sdk/*README        usr/share/doc/oracle-instant-client/

ln -s libclntsh.so.11.1 usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so
ln -s libocci.so.11.1   usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libocci.so

echo /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib > etc/ld.so.conf.d/oracle-instant-client.conf

tar zcvf oracle_instant_client-11.2.0.1.tgz usr etc
alien oracle_instant_client-11.2.0.1.tgz

oracle-instant-client_11.2.0.1-2_all.deb が出来るので
# dpkg --purge php5-pdo-oci
# dpkg --purge oracle-xe-client
# dpkg -i oracle-instant-client_11.2.0.1-2_all.deb
# aptitude install libaio
としてインストール。
# export ORACLE_HOME=usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client
にして pdo_oci を再度 .deb 化する
alien が oracle-instant-client.shlibs 作ってくれているので
debian/shlibs.local は不要につき削除
完成したら php5-pdo-oci を再インストールして apache2 を再起動しとく

以上で、11gR2 対応になったはずなのだが
seg る症状は変わらないが
backtrace が出来るようになったので
多少は症状が改善しているようなしてないような
$ export NLS_LANG=American_America.UTF8
$ gdb php
GNU gdb 6.8-debian
Copyright (C) 2008 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 "i486-linux-gnu"...
(gdb) run pdo_oci_test.php
Starting program: /usr/bin/php pdo_oci_test.php
Failed to read a valid object file image from memory.
[Thread debugging using libthread_db enabled]
[New Thread 0xb78366d0 (LWP 8442)]
----------------------------------------------------------------
0
----------------------------------------------------------------
1
Errors in file :
OCI-21500: internal error code, arguments: [kohfrm771], [], [], [], [], [], [], []

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb78366d0 (LWP 8442)]
0xb60164cc in slaac_int () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
(gdb) bt
#0  0xb60164cc in slaac_int () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#1  0xb6016406 in slrac () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#2  0xb6e65caf in sskgds_plt_adjust () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#3  0xb6e65d69 in sskgds_find_rtn_hdr () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#4  0xb6e5c0ce in skgdstpcs () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#5  0xb6c10435 in kgdsdst () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#6  0xb66deb6e in skgudmp () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#7  0xb6bdb540 in kgerinv_internal () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#8  0xb6bdb4cb in kgerinv () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#9  0xb6bddead in kgesinv () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#10 0xb6bde0d3 in kgesin () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#11 0xb741d2cf in kohfrem () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#12 0xb741c668 in kohfrr () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#13 0xb741c60e in kohfrw () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#14 0xb73f4068 in kollfrfn () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#15 0xb6b472e3 in kpccld2i () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#16 0xb6b3ce64 in ttccpwg () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#17 0xb73a1ed0 in ttcfour () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#18 0xb739a468 in ttcdrv () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#19 0xb73543b8 in nioqwa () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#20 0xb733f1e5 in upirtrc () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#21 0xb7349a60 in kpurcsc () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#22 0xb73476d8 in kpufch0 () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#23 0xb7346138 in kpufch () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#24 0xb5c25488 in OCIStmtFetch2 () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#25 0xb7f9ad10 in oci_stmt_fetch (stmt=0xc9e8, ori=PDO_FETCH_ORI_NEXT, offset=0) at /tmp/php-5.3.2/ext/pdo_oci/php-pdo-oci-1.0.1/PDO_OCI-1.0.1/oci_statement.c:448
#26 0xb76eea1a in do_fetch_common (stmt=0x86fa750, ori=PDO_FETCH_ORI_NEXT, offset=0, do_bind=1) at /tmp/buildd/php5-5.2.6.dfsg.1/ext/pdo/pdo_stmt.c:669
#27 0xb76eeb4e in do_fetch (stmt=0x86fa750, do_bind=0, return_value=0x87084cc, how=PDO_FETCH_USE_DEFAULT, ori=PDO_FETCH_ORI_NEXT, offset=0, return_all=0x0) at /tmp/buildd/php5-5.2.6.dfsg.1/ext/pdo/pdo_stmt.c:904
#28 0xb76f05d8 in zim_PDOStatement_fetch (ht=0, return_value=0x87084cc, return_value_ptr=0x0, this_ptr=0x86fa24c, return_value_used=1) at /tmp/buildd/php5-5.2.6.dfsg.1/ext/pdo/pdo_stmt.c:1361
#29 0x0830d933 in zend_do_fcall_common_helper_SPEC (execute_data=0xbf9c60ec) at /tmp/buildd/php5-5.2.6.dfsg.1/Zend/zend_vm_execute.h:200
#30 0x082f8dc0 in execute (op_array=0x86f953c) at /tmp/buildd/php5-5.2.6.dfsg.1/Zend/zend_vm_execute.h:92
#31 0x082d3500 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /tmp/buildd/php5-5.2.6.dfsg.1/Zend/zend.c:1215
#32 0x08289423 in php_execute_script (primary_file=0xbf9c84bc) at /tmp/buildd/php5-5.2.6.dfsg.1/main/main.c:2028
#33 0x08356981 in main (argc=2, argv=0xbf9c85a4) at /tmp/buildd/php5-5.2.6.dfsg.1/sapi/cli/php_cli.c:1146
(gdb) 

なぜか NLS_LANG で seg る場所が変わる
$ export NLS_LANG=American_America.JA16SJIS
$ gdb php
GNU gdb 6.8-debian
Copyright (C) 2008 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 "i486-linux-gnu"...
(gdb) run pdo_oci_test.php
Starting program: /usr/bin/php pdo_oci_test.php
Failed to read a valid object file image from memory.
[Thread debugging using libthread_db enabled]
[New Thread 0xb78036d0 (LWP 8475)]
----------------------------------------------------------------
0
----------------------------------------------------------------
1

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb78036d0 (LWP 8475)]
0xb73ea589 in kohfri () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
(gdb) bt
#0  0xb73ea589 in kohfri () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#1  0xb73ea30a in kohfrem () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#2  0xb73e9668 in kohfrr () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#3  0xb73e960e in kohfrw () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#4  0xb73c1068 in kollfrfn () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#5  0xb6b142e3 in kpccld2i () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#6  0xb6b09e64 in ttccpwg () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#7  0xb736eed0 in ttcfour () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#8  0xb7367468 in ttcdrv () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#9  0xb73213b8 in nioqwa () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#10 0xb730c1e5 in upirtrc () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#11 0xb7316a60 in kpurcsc () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#12 0xb73146d8 in kpufch0 () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#13 0xb7313138 in kpufch () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#14 0xb5bf2488 in OCIStmtFetch2 () from /usr/lib/oracle/instant/app/oracle/product/11.2.0.1/client/lib/libclntsh.so.11.1
#15 0xb7f67d10 in oci_stmt_fetch (stmt=0x8784248, ori=PDO_FETCH_ORI_NEXT, offset=0) at /tmp/php-5.3.2/ext/pdo_oci/php-pdo-oci-1.0.1/PDO_OCI-1.0.1/oci_statement.c:448
#16 0xb76bba1a in do_fetch_common (stmt=0x86fae20, ori=PDO_FETCH_ORI_NEXT, offset=0, do_bind=1) at /tmp/buildd/php5-5.2.6.dfsg.1/ext/pdo/pdo_stmt.c:669
#17 0xb76bbb4e in do_fetch (stmt=0x86fae20, do_bind=1962965504, return_value=0x8708b9c, how=PDO_FETCH_USE_DEFAULT, ori=PDO_FETCH_ORI_NEXT, offset=0, return_all=0x0) at /tmp/buildd/php5-5.2.6.dfsg.1/ext/pdo/pdo_stmt.c:904
#18 0xb76bd5d8 in zim_PDOStatement_fetch (ht=0, return_value=0x8708b9c, return_value_ptr=0x0, this_ptr=0x86fa91c, return_value_used=1) at /tmp/buildd/php5-5.2.6.dfsg.1/ext/pdo/pdo_stmt.c:1361
#19 0x0830d933 in zend_do_fcall_common_helper_SPEC (execute_data=0xbfc5537c) at /tmp/buildd/php5-5.2.6.dfsg.1/Zend/zend_vm_execute.h:200
#20 0x082f8dc0 in execute (op_array=0x86f9c0c) at /tmp/buildd/php5-5.2.6.dfsg.1/Zend/zend_vm_execute.h:92
#21 0x082d3500 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /tmp/buildd/php5-5.2.6.dfsg.1/Zend/zend.c:1215
#22 0x08289423 in php_execute_script (primary_file=0xbfc5774c) at /tmp/buildd/php5-5.2.6.dfsg.1/main/main.c:2028
#23 0x08356981 in main (argc=2, argv=0xbfc57834) at /tmp/buildd/php5-5.2.6.dfsg.1/sapi/cli/php_cli.c:1146
(gdb) 

10段くらい浅いところで seg ってる模様。
潜った後に seg ってるのか?
潜る前に seg ってるのか?

pdo_oci はあきらめて
Debian - PHP/ext/oci8
を試す事にした

結果、とりあえず seg る症状は改善

結局腐ってるのは oracle 側じゃなく
pdo_oci 側の API 呼び出しな模様
バカみたいにフィールドが多いテーブルを引いてるので
多分、バッファ取得時に失敗してるのをきちんとエラー処理してないとか
そういう理由で seg ってるんじゃないかと妄想
タグ

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます