2019年1月21日月曜日

TOPPERS cfg の 64 bit ビルドに挑戦した記録(その3 セグフォを直したかった...)

最適化を有効にするとセグフォが出るのでそれを直したかったが失敗した。

gdb を使えば、セグフォした場所がわかるらしいのでやってみた。

docker で gdb を使う場合、セキュリティが低下するらしいので、今回は kanetugu2015/athrill_asp3 は使わずに、 ubuntu イメージを使って一からコンテナを作り直して作業を行った。

とりあえず、何をしたかを記録する。

docker コンテナの準備

今回作業するコンテナをダウンロード。

docker pull ubuntu:bionic

必要なファイルをマウントしつつ、コンテナを起動。

前回作った OBJ ディレクトリ内の成果物を丸ごと今回使う OBJ ディレクトリにコピーしたうえで、コンテナを実行する。

docker run -it --rm -v "$(pwd)\athrill:/athrill" -v "$(pwd)\cfg:/cfg" --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" ubuntu:bionic

前々回と同様に、 cfg ビルド環境を整える。 あと、 gdb も入れる。

apt-get update
apt-get upgrade
apt-get install -y gdb g++ make libboost-dev libboost-regex-dev libboost-system-dev libboost-filesystem-dev libboost-program-options-dev libxerces-c-dev

cfg のビルド

このコンテナで使うための cfg ビルドを行う。

最適化を有効にして、デバッグ情報付きビルドを行う。

cd /cfg
./configure --with-libraries=/usr/lib/x86_64-linux-gnu --with-xml
sed -i -e 's/OPTIMIZE = -O0/OPTIMIZE = -O2/' Makefile
sed -i -e 's/OPTIONS=/OPTIONS=-g3/' Makefile.config
make

cfg 実行

cp /cfg/cfg/cfg /athrill/sample/os/atk2-sc1_1.4.2/cfg/cfg/cfg
cd /athrill/sample/os/atk2-sc1_1.4.2/OBJ/
../cfg/cfg/cfg --pass 2 --kernel atk2 -I. -I../include -I../arch -I..  -I../target/v850esfk3_gcc -I..//arch/v850esfk3_gcc -I..//arch/gcc -T ../target/v850esfk3_gcc/target.tf --api-table ../kernel/kernel.csv --cfg1-def-table ../kernel/kernel_def.csv --ini-file ../kernel/kernel.ini  --cfg1-def-table ..//arch/v850esfk3_gcc/prc_def.csv sample1.arxml ..//arch/v850esfk3_gcc/uart.arxml ../target/v850esfk3_gcc/target_hw_counter.arxml

セグフォが出ることを確認できた。

gdb によるセグフォ箇所の特定

説明が難しいので、丸ごとログを載せることで済ます。 (気になる人は頑張って読み解いてください)

root@09f28b89344c:/athrill/sample/os/atk2-sc1_1.4.2/OBJ# gdb ../cfg/cfg/cfg
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 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".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ../cfg/cfg/cfg...done.
(gdb) run --pass 2 --kernel atk2 -I. -I../include -I../arch -I..  -I../target/v850esfk3_gcc -I..//arch/v85
0esfk3_gcc -I..//arch/gcc -T ../target/v850esfk3_gcc/target.tf --api-table ../kernel/kernel.csv --cfg1-def
-table ../kernel/kernel_def.csv --ini-file ../kernel/kernel.ini  --cfg1-def-table ..//arch/v850esfk3_gcc/p
rc_def.csv sample1.arxml ..//arch/v850esfk3_gcc/uart.arxml ../target/v850esfk3_gcc/target_hw_counter.arxml
Starting program: /athrill/sample/os/atk2-sc1_1.4.2/cfg/cfg/cfg --pass 2 --kernel atk2 -I. -I../include -I
../arch -I..  -I../target/v850esfk3_gcc -I..//arch/v850esfk3_gcc -I..//arch/gcc -T ../target/v850esfk3_gcc
/target.tf --api-table ../kernel/kernel.csv --cfg1-def-table ../kernel/kernel_def.csv --ini-file ../kernel
/kernel.ini  --cfg1-def-table ..//arch/v850esfk3_gcc/prc_def.csv sample1.arxml ..//arch/v850esfk3_gcc/uart
.arxml ../target/v850esfk3_gcc/target_hw_counter.arxml
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
{ "EXEC kernel.tf"(),  }
{ "ASSOCIATE TASK"(),  }
{ "ASSOCIATE ISR"(),  }
{ "ASSOCIATE ALARM"(),  }
{ "ASSOCIATE SCHTBL"(),  }
{ "ISR CHECK"(),  }
{ "RESOURCE CHECK"(),  }
{ "TASK CHECK"(),  }
{ "EVENT CHECK"(),  }

{ "COUNTER CHECK"(),  }
{ "ALARM CHECK"(),  }
{ "SCHEDULETABLE CHECK"(),  }

{ "OUTPUT FILES"(),  }


Program received signal SIGSEGV, Segmentation fault.
boost::checked_delete<boost::spirit::classic::impl::object_with_id_base_supply<unsigned long> > (x=0x1)
    at /usr/include/boost/core/checked_delete.hpp:34
34          delete x;
(gdb) backtrace
#0  boost::checked_delete<boost::spirit::classic::impl::object_with_id_base_supply<unsigned long> > (
    x=0x1) at /usr/include/boost/core/checked_delete.hpp:34
#1  boost::detail::sp_counted_impl_p<boost::spirit::classic::impl::object_with_id_base_supply<unsigned lon
g> >::dispose (this=0x555555e2eac0) at /usr/include/boost/smart_ptr/detail/sp_counted_impl.hpp:92
#2  0x00005555555a2bea in boost::detail::sp_counted_base::release (this=0x555555e2eac0)
    at /usr/include/boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp:110
#3  0x00007ffff61cc041 in __run_exit_handlers (status=0, listp=0x7ffff6574718 <__exit_funcs>,
    run_list_atexit=run_list_atexit@entry=true, run_dtors=run_dtors@entry=true) at exit.c:108
#4  0x00007ffff61cc13a in __GI_exit (status=<optimized out>) at exit.c:139
#5  0x00007ffff61aab9e in __libc_start_main (main=0x555555585ef0 <main(int, char**)>, argc=25,
    argv=0x7fffffffe498, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>,
    stack_end=0x7fffffffe488) at ../csu/libc-start.c:344
#6  0x000055555558737a in _start ()
(gdb)

... __run_exit_handlers とか boost::detail::sp_counted_base::release とか見えますね...。

どこかで作ったインスタンスのポインタがぶっ壊れて、プログラム終了時点(?)でセグフォとなって襲い掛かってきた感じ?

ちょっと追いかけられる気がしないですね。とりあえずあきらめる感じで。

以上、うーん残念。

0 件のコメント:

コメントを投稿