#0 0x0804d551 in AnalysEN::ReadParam(_ID_FILE *) (this=0x24ad4e58, param=0x24ad4e68 ) at AnalysEnergy.cpp:69 69 par->c0[i]=c0/1000.0; と ライセンス 表 示 の 後



Similar documents
slide5.pptx

r07.dvi

ohp07.dvi

Prog1_14th

Condition DAQ condition condition 2 3 XML key value

Microsoft Word - tb01.doc

MetaMoJi ClassRoom/ゼミナール 授業実施ガイド

ohp03.dvi

r03.dvi

programmingII2019-v01

r08.dvi

Microsoft PowerPoint - kougi9.ppt

Microsoft Word - 構造振動特論-08回-2012.doc

労働時間と休日は、労働条件のもっとも基本的なものの一つです

Microsoft PowerPoint - comprog08.ppt [互換モード]

ohp08.dvi

<4D F736F F F696E74202D2082C882E982D982C DD8ED88EE688F882CC82B582AD82DD C668DDA9770>

C

double float

Microsoft Word - 不正アクセス行為の禁止等に関する法律等に基づく公安

2. 番 号 種 別 の 利 用 方 法 わが 国 の 番 号 方 式 に 照 らして INSネットでの 番 号 種 別 の 具 体 的 な 利 用 方 法 を 記 述 すると 以 下 のようにな ります (1) 番 号 種 別 (TON)= 不 定 電 話 サービスと 同 様 のダイヤル 手 順

目 次 1. Web メールのご 利 用 について Web メール 画 面 のフロー 図 Web メールへのアクセス ログイン 画 面 ログイン 後 (メール 一 覧 画 面 ) 画 面 共 通 項 目

戦略担当者のための

( 別 紙 ) 以 下 法 とあるのは 改 正 法 第 5 条 の 規 定 による 改 正 後 の 健 康 保 険 法 を 指 す ( 施 行 期 日 は 平 成 28 年 4 月 1 日 ) 1. 標 準 報 酬 月 額 の 等 級 区 分 の 追 加 について 問 1 法 改 正 により 追 加

東近江行政組合職員の育児休業等に関する条例

超初心者用

<4D F736F F D F582CC88E78E998B788BC693998FF097E15F E31318C8E333093FA816A>

入札公告 機動装備センター

1. 前 払 式 支 払 手 段 サーバ 型 の 前 払 式 支 払 手 段 に 関 する 利 用 者 保 護 等 発 行 者 があらかじめ 利 用 者 から 資 金 を 受 け 取 り 財 サービスを 受 ける 際 の 支 払 手 段 として 前 払 式 支 払 手 段 が 発 行 される 場 合

第1回

<4D F736F F F696E74202D C90BF8F CC8DEC90AC97E181698A4F8D E8816A5F56322E707074>

SXF 仕 様 実 装 規 約 版 ( 幾 何 検 定 編 ) 新 旧 対 照 表 2013/3/26 文 言 変 更 p.12(1. 基 本 事 項 ) (5)SXF 入 出 力 バージョン Ver.2 形 式 と Ver.3.0 形 式 および Ver.3.1 形 式 の 入 出 力 機 能 を

4 教 科 に 関 する 調 査 結 果 の 概 況 校 種 学 年 小 学 校 2 年 生 3 年 生 4 年 生 5 年 生 6 年 生 教 科 平 均 到 達 度 目 標 値 差 達 成 率 国 語 77.8% 68.9% 8.9% 79.3% 算 数 92.0% 76.7% 15.3% 94

取 り 消 された 後 当 該 産 前 の 休 業 又 は 出 産 に 係 る 子 若 しくは 同 号 に 規 定 する 承 認 に 係 る 子 が 死 亡 し 又 は 養 子 縁 組 等 により 職 員 と 別 居 することとなったこと (2) 育 児 休 業 をしている 職 員 が 休 職 又

HDC-EDI BaseのAny変換における閏年の取り扱いに関する重要なお知らせ

スライド 1

1

施 工 P お 気 に 入 り データを 活 用 するための 準 備 施 工 パッケージデータをお 気 に 入 りに 登 録 し 単 価 を 閲 覧 するための 方 法 を 説 明 します 1. 施 工 パッケージデータをダウンロードする 施 工 パッケージデータのダウンロードは 下 記 から 行

Microsoft Word - TS _J Edited3.doc

4-3-4共立蒲原総合病院組合職員の育児休業等に関する条例

PowerPoint Presentation

件名

- 1 - 総 控 負 傷 疾 病 療 養 産 産 女 性 責 帰 べ 由 試 ~ 8 契 約 契 約 完 了 ほ 契 約 超 締 結 専 門 的 知 識 技 術 験 専 門 的 知 識 高 大 臣 専 門 的 知 識 高 専 門 的 知 識 締 結 契 約 満 歳 締 結 契 約 契 約 係 始

t検定

佐渡市都市計画区域の見直し

yacc.dvi

cpp1.dvi

った 場 合 など 監 事 の 任 務 懈 怠 の 場 合 は その 程 度 に 応 じて 業 績 勘 案 率 を 減 算 する (8) 役 員 の 法 人 に 対 する 特 段 の 貢 献 が 認 められる 場 合 は その 程 度 に 応 じて 業 績 勘 案 率 を 加 算 することができる

EC-OrangePOS 簡易マニュアル

Microsoft Word - 教科書VBA_第1章2013_.doc

DN6(R04).vin

Taro-正社員と期間雇用社員との労

経 常 収 支 差 引 額 等 の 状 況 平 成 26 年 度 予 算 早 期 集 計 平 成 25 年 度 予 算 対 前 年 度 比 較 経 常 収 支 差 引 額 3,689 億 円 4,597 億 円 908 億 円 減 少 赤 字 組 合 数 1,114 組 合 1,180 組 合 66

Microsoft PowerPoint - CproNt02.ppt [互換モード]

調査結果の概要

2.4 箇 条 書 のスタイルを 変 更 する 右 クリックして 箇 条 書 と 番 号 付 け を 選 択 する. あとは 少 し 遊 べば, このようなことをやりたい 人 は 理 解 できると 思 います 3 いろいろな 入 力 ワープロを 使 う 上 で 肝 心 な 点 は, 空 白 調 整

RaQuest MindManager


<4D F736F F D CF322D33817A95DB8CEC8ED292B28DB881698A6D816A2E646F63>

double 2 std::cin, std::cout 1.2 C fopen() fclose() C++ std::fstream 1-3 #include <fstream> std::fstream fout; int a = 123; fout.open( "data.t

(4) 給 与 制 度 の 総 合 的 見 直 しの 実 施 状 況 について 概 要 国 の 給 与 制 度 の 総 合 的 見 直 しにおいては 俸 給 表 の 水 準 の 平 均 2の 引 下 げ 及 び 地 域 手 当 の 支 給 割 合 の 見 直 し 等 に 取 り 組 むとされている.

file:///L|/kajo/_RESOURCE/index.html

debug ( ) 1) ( ) 2) ( ) assert, printf ( ) Japan Advanced Institute of Science and Technology

Introduction Purpose This training course demonstrates the use of the High-performance Embedded Workshop (HEW), a key tool for developing software for

医 療 費 自 己 負 担 額 支 払 明 細 書 入 力 シート - 目 次 - < 第 1 章 > 共 通 事 項 説 明 医 療 費 自 己 負 担 額 支 払 明 細 書 入 力 シート 目 次 1.1 本 システムの 注 意 点 入 力 項 目 について 基 本 情

2016 年 度 情 報 リテラシー 変 更 された 状 態 同 様 に 価 格 のセルを 書 式 設 定 する 場 合 は 金 額 のセルをすべて 選 択 し [ 書 式 ]のプルダウンメニューか ら[ 会 計 ]を 選 択 する すると が 追 加 され 金 額 としての 書 式 が 設 定 さ

(3) その 他 市 長 が 必 要 と 認 める 書 類 ( 補 助 金 の 交 付 決 定 ) 第 6 条 市 長 は 前 条 の 申 請 書 を 受 理 したときは 速 やかにその 内 容 を 審 査 し 補 助 金 を 交 付 すべきものと 認 めたときは 規 則 第 7 条 に 規 定 す

Microsoft Word - word_05.docx

1. プロジェクトサンプルのダウンロードと 解 凍 1.1. プロジェクトサンプルのダウンロード 当 サイトのプロジェクトサンプルの 圧 縮 ファイルBlink_LED_Status_10K.zipをダウンロードしてください ダウンロードが 終 了 したら [フォルダーを 開 く] ボタンをくりっく

Taro-H19退職金(修正版).jtd

役員退職手当規程

DC-104R バージョンアップ資料

Microsoft Word - 参考資料:SCC_IPsec_win8__リモート設定手順書_

Taro-1-14A記載例.jtd

Microsoft PowerPoint 葉玉弁護士資料.ppt

文科省様式3-2集計オプションマニュアル

接続試験実施要領【障害者総合支援法(平成27年4月報酬改定)対応】

<8BB388F58F5A91EE82A082E895FB8AEE967B95FB906A>

Microsݯft Word - 91 forܠ2009November.docx


国立大学法人 東京医科歯科大学教職員就業規則

1-4 int a; std::cin >> a; std::cout << "a = " << a << std::endl; C++( 1-4 ) stdio.h iostream iostream.h C++ include.h 1-4 scanf() std::cin >>

スライド 1

(5) 給 与 制 度 の 総 合 的 見 直 しの 実 施 状 況 について 概 要 の 給 与 制 度 の 総 合 的 見 直 しにおいては 俸 給 表 の 水 準 の 平 均 2の 引 き 下 げ 及 び 地 域 手 当 の 支 給 割 合 の 見 直 し 等 に 取 り 組 むとされている

測量士補 重要事項「写真地図作成」

Microsoft Word - 新Excel&SAS資料.doc

Microsoft Word - tutorial7-language.docx

1.2. ご 利 用 環 境 推 奨 ブラウザ Internet Explorer Google Chrome(バージョン 32 時 点 で 動 作 確 認 済 み) Mozilla Firefox(バージョン 26 時 点 で 動 作 確 認 済 み) Safari 7

<4D F736F F D C97F195CF8AB DEC90E096BE8F912091E6312E313294C52E646F63>

01_07_01 データのインポート_エクスポート_1

今 月 の 末 日 =DATE(YEAR(TODAY()),MONTH(TODAY())+1,0) 月 を +1 し 日 を 0 にします 来 年 の 元 日 =DATE(YEAR(TODAY())+1,1,1) 生 年 月 日 など 期 日 を 指 定 して 開 始 日 や 終 了 日 を 求 め

2. ど の 様 な 経 緯 で 発 覚 し た の か ま た 遡 っ た の を 昨 年 4 月 ま で と し た の は 何 故 か 明 ら か に す る こ と 回 答 3 月 17 日 に 実 施 し た ダ イ ヤ 改 正 で 静 岡 車 両 区 の 構 内 運 転 が 静 岡 運

<4D F736F F D D3188C091538AC7979D8B4B92F F292B98CF092CA81698A94816A2E646F63>

単回帰モデル

Microsoft PowerPoint - C++_第1回.pptx

端 末 型 払 い 出 しの 場 合 接 続 構 成 図 フレッツ グループから 払 出 されたIPアドレス /32 NTT 西 日 本 地 域 IP 網 フレッツ グループ フレッツ グループから 払 出 されたIPアドレス /

1 変更の許可等(都市計画法第35条の2)

CSV_Backup_Guide

富士山チェックリスト

<4D F736F F D2088E78E998B788BC C98AD682B782E98B4B92F62E646F63>

Transcription:

Debugger ( gdb ) の 使 い 方 プログラムを 走 らせたとき #./AnaEN inputfile gomi.hbook data.dat Segmentation fault (core dumped) # となって コアダンプしたときほどいやなことはないと 思 います 短 いプログラムならソースファイルを 見 て あるいは ところどころに printf を 埋 め 込 んで( printf デバッグ ) 原 因 が 突 き 止 められるかもしれません しかし プログラムの 規 模 が 大 きくなると printf デバッグでは 効 率 が 悪 すぎます また printf を call すると 最 適 化 の 状 態 が 変 わり 正 常 に 動 く 場 合 があります デバッガを 使 うと コアダンプした 箇 所 がわかります また 任 意 の 場 所 で 実 行 を 止 めて (ブレークポイントとい う)その 状 態 での 変 数 の 値 を 見 ることができます gcc では 最 適 化 を 有 効 にしかつ デバッグ 用 のコードを 生 成 できます こ こでは gdb の 使 い 方 を 示 します 1. Debug 用 コードの 生 成 デバッグ 用 コードを 生 成 するには コンパイル 時 に -g オプションをつけてコンパイルします Makefile に 次 のように 書 い ておくとよい DEBUGFLAG = -g CC = gcc C++ = g++ CFLAGS = -O $(DEBUGFLAG).c.o:.cpp.o: $(CC) -c $(CFLAGS) $< $(C++) -c $(CFLAGS) $< これで Debug 用 の 情 報 が 埋 め 込 まれた 実 行 ファイルが 生 成 される このプログラムはオプションなしで 生 成 したものに 比 べ サイズが 大 きくなっており 実 行 時 パフォーマンスは 低 下 するが 通 常 はつけてコンパイルすることを 進 める 2. プログラムを 実 行 して コアダンプしたら プログラム 実 行 中 に 処 理 できない 例 外 が 発 生 すると プロセスはカーネルによりアボートされます アボート 時 には 通 常 そのときのプロセスイメージ(メモリ プロセスコンテキストなど)を core というファイルに 出 力 します これをコアダンプとい い デバッガを 使 って 解 析 する 事 により 例 外 発 生 時 の 状 態 が 調 べられます core ファイルは シェル 変 数 coredumpsize が 0 に 設 定 されていると 生 成 されません また 最 近 の RH8.0 では core.xxx (xxx はプロセス ID) というファイル 名 で 生 成 されます さて 上 の 例 でどこに 問 題 があったか 調 べてみましょう # gdb./anaen core とすると core ファイルを 読 み 込 み 例 外 が 起 きた 状 態 になる GNU gdb 5.2.1 Copyright 2002 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain condistions. Type "show copying" to see the conditions. Three is absolutely no warranty for GDB. The "show waranty" for details. This GDB was configured as "i686-pc-linux-gnu" Core was generated by `./AnaEN inputfile gomi.hbook..` (1) Program terminated with signal 11, Segmentation fault. (2) Reading symbols from /cern/geant4/lib/libg4digits+hits.sodone. Loading symbols for /lib/ld-linux.so.2

#0 0x0804d551 in AnalysEN::ReadParam(_ID_FILE *) (this=0x24ad4e58, param=0x24ad4e68 ) at AnalysEnergy.cpp:69 69 par->c0[i]=c0/1000.0; と ライセンス 表 示 の 後 "./AnaEN inputfile gomi.hbook data.dat" というプログラムの 実 行 で core が 生 成 されたこと((1)) Signal 11 の "Segmentation fault" が 例 外 であったこと((2)) の 表 示 のあと 共 有 ライブラリ 中 のシンボルテーブルを 読 み 込 み 例 外 の 起 きたコードのアドレス(0x0804d551)でこれは AnalysEN::ReadParam 関 数 の par-.>c0[i]=c0/1000.0; の 行 ( AnalysEnergy.cpp の 69 行 目 )であることを 示 している また この 関 数 の 実 引 数 も 示 されている この 部 分 のソースファイ ルを 見 ると /* AnalysEnergy.h */ #include "HBook.h" struct POS; struct PARAM; class AnalysEN public: AnalysEN(); ~AnalysEN(); bool ReadParam( FILE *param ); private: POS *position; PARAM *par; ; /* AnalysEnergy.cpp */ #include "AnalysEnergy.h" struct PARAM double C0[2]; double C1[2]; double C2[2]; double C3[2]; double C4[2]; ; bool AnalysEN::ReadParam( FILE *param ) std::cout << "Read parameter " << std::endl; char str[144]; double c0, c1, c2, c3, c4; for( int i=0; i<2; ++i ) if( fgets( str, 144, param )!=0 ) sscanf( str, "%lf %lf %lf %lf %lf", &c0, &c1, &c2, &c3, %c4 ); par->c0[i]=c0/1000.0;

par->c1[i]=c1/1000.0; par->c2[i]=c2/1000.0; par->c3[i]=c3/1000.0; par->c4[i]=c4/1000.0; else return false; return true; Segmentation fault は 大 抵 存 在 しないアドレスへのアクセスをしたときに 発 生 する たとえば 1) 配 列 の 境 界 を 越 えたア クセス(アドレスが 存 在 すれば そのときは 問 題 が 起 きないが 別 の 変 数 を 書 き 換 えたときは 発 見 しづらいバグとなる ) 2)オブジェクトを 指 していないポインタ 経 由 でのアクセス( 何 が 起 こるかわからない) である まず 1)でないか 変 数 i の 値 を 調 べてみる $1 = 0 となり i の 値 は 0 であることがわかり 1)ではない par->c0[i] はどうだろうか? print par->c0[i] Cannot access memory at address 0x0 アドレスが 存 在 しない 様 に 見 える さらに print par $2 = (PARAM *) 0x0 となり ポインタ par は 何 も 指 していないヌルポインタであるとわかる これが 原 因 であった コンストラクタのソースを 見 る と AnalysEN::AnalysEN() std::cout << "AnalysEN::Constructor " << std::endl; とあって ポインタ position と par が(オブジェクトを 指 すように) 初 期 化 されていない 次 の 様 に 書 き 換 える 同 時 にデ ストラクタでは コンストラクタで 確 保 したメモリを 解 放 しないとメモリリーク(これもデバッグしづらい 深 刻 なバグである )にな るので 修 正 する AnalysEN::AnalysEN() : position( new POS ), par( new PARAM ) std::cout << "AnalysEN::Constructor " << std::endl; AnalysEN::~AnalysEN() if(position) delete position; if(par) delete par; この 修 正 で この 場 合 はうまく 動 くようになった 大 規 模 プログラムでは 問 題 の 部 分 がどこにあるかを 調 べるために プログラムの 開 始 からそこにたどりつくまでの 構 造 が わかった 方 がよい 場 合 がある そのときは bt #0 0x0804d551 in AnalysEN::ReadParam(_ID_FILE *) (this=0x24ad4e59, param=0x24ad4e68) at AnalysEnergy.cpp:69 #1 0x0804d27d in main (argc=0, argv=0x50) at Main.cpp:100 #2 0x416c8316 in libc_start_main(main=0x804d1a6 <main>, argc=4, ubp_av=0xbffffb3c, init=0x804c0d8 <_init>, fini=0x80a768c <_fini>,

rtld_fini=0x4000d2fc <_dl_fini>, stack_end=0xbffffb2c) at../sysdeps/generic/libc-start.c:129 のように スタートアップコードまで プログラムスタックをさかのぼって 表 示 してくれる 様 々な 関 数 から 呼 ばれる 関 数 では どこから 呼 ばれているのか?こうして 調 べられる Geant4 の G4Exception は コアダンプして プログラムを 終 了 する 関 数 であるが コアダンプの 原 因 はこの 関 数 にあるのではない Geant4 では 計 算 不 能 な 状 態 を 検 知 すると G4Exception を 呼 ぶ 様 にかかれているので bt ( Back Trace )で G4Exception を 呼 んだ 関 数 を 調 べるとよい ただし 例 外 が 起 きた 原 因 は その 関 数 にあるわけではない( 例 外 状 態 を 検 知 しただけ)ので 注 意 すること 3. gdb の 中 でプログラムを 実 行 する コアダンプしないけどプログラムの 挙 動 がおかしい コアダンプしたところ 以 前 に 問 題 がある などの 場 合 gdb の 中 で(1 文 1 文 ) 実 行 し 変 数 を 調 べられます そのためには プログラム 中 に Breakpoint というものを 設 定 します Breakpoint で gdb はプログラムの 実 行 を 一 時 中 断 します 以 下 にコマンドを 示 します * run [Command Arguement] プログラムを 実 行 ( 最 初 から)する Command Argument がある 場 合 は 与 える * break Filename:Line Breakpoint の 設 定 ソースファイルと 行 番 号 を 与 える * c 実 行 の 再 開 中 断 したところから 再 開 します ( 次 の Breakpoint で 止 まる ) * next または step ステップ 実 行 1 行 を 実 行 して 止 まる 実 行 中 断 中 は 上 で 述 べた print コマンドで 変 数 の 値 などを 調 べられます 以 下 に 実 行 例 を 示 します ( bool AnalysEN::ReadParam( FILE *param ) は AnalysEnergy.cpp の59 行 目 ) # gdb./anaen GNU gdb 5.2.1 This GDB was configured as "i686-pc-linux-gnu" break AnalysEnergy.cpp:59 Breakpoint 1 at 0x804d4e4: file AnalysEnergy.cpp, line 59. run inputfile gomi.hbook data.dat Starting program: /users/takahasi/nks/analyzer/enecal/anaen inputfile gomi.hbook data.dat Breakpoint 1, AnalysEN::ReadParam(_ID_FILE*) (this=0xbfffa3fc, param=0xbfffa40) at AnalysEnergy.cpp:60 60 (gbd) next AnalysEN::ReadParam(_ID_FILE*) (this=0x24ad4e98, param=0x24ad4f50) at AnalysEnergy.cpp:61 61 std::cout << "Read parameter " << std::endl; Read parameter 65 for(int i=0; i<2; ++i) $1 = 1 66 if( fgets( str, 144, param )!=0 ) 65 for(int i=0; i<2; ++i ) $2 = 0 69 par->c0[i]=c0/1000.0; $3 = 0 c

Program exited normally. 何 か 実 行 順 序 が 変 な 気 がするが 最 適 化 のためでしょう (そうなのか? 最 適 化 をはずしてみればわかる) また 実 行 文 でない 行 はとばされていることもわかります 4.おまけ 行 番 号 を 調 べるとき 行 番 号 表 示 付 きのエディタを 使 えればよいのだが ない 場 合 は 次 のようにする # cat -n AnalysEnergy.cpp less 59 bool AnalysEN::ReadParam( FILE *param) 60 61 std::cout << "Real parameter " << std::endl; 62 char str[144]: 上 の 例 で 最 適 化 をはずした 場 合 Read parameter 65 for(int i=0; i<2; ++i ) $1 = 1073830040 <- 変 数 が 未 定 義 (for 文 の 前 だから) 66 if( fgets( str, 144, param )!=0 ) 67 sscanf( str, "%lf %lf %lf %lf %lf", となり 最 適 化 の 有 無 によって for ループの 実 行 に 違 いがあることがわかる