質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

Q&A

1回答

2095閲覧

Linuxアプリケーション フリーズ調査方法について

LS_Takao

総合スコア13

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

0グッド

0クリップ

投稿2018/10/05 03:03

編集2018/10/05 09:42

QtCreator(Qt 5.5)を用いて作成したアプリケーションをLinux Yocto(4.2)で実行しています。
このアプリケーションが不定期(数時間~数日)でフリーズしてしまうため、原因の調査方法を模索しています。
アプリケーションが動作するPCは複数のコアで構成されています。

具体的な事象としてはアプリケーションが無応答になるという状況です。
1秒定期で時刻を表示していたとして、その表示更新が行われなくなるイメージです。
システム構成はアプリケーション(プロセス)とスケジューラ(プロセス)が存在し、別々のコアで動作しています。
※スケジューラの主な機能は定期的にメッセージを配信するというものです。
※時刻の表示はQtの機能を用いています。

フリーズ発生時、アプリケーションとスケジューラの両方が停止していました。
試しにアプリケーションで無限ループさせてもスケジューラはフリーズせず、
逆にスケジューラで無限ループさせてもアプリケーションはフリーズしないことは確認済みです。
アプリケーションとスケジューラの間でデッドロックが発生しているような状況です。

但し、完全にフリーズした状態に至る前、アプリケーションの時刻表示更新がしばらく(30~40秒)止まった後、再開されるという動作を確認しています。
この「しばらく止まった後、再開する」という点から考えるとデッドロックでは無いのではと想像しています。

Linux上でのデバッグについて情報が乏しいため、情報を集めいています。
アプリケーションをビルドし直すと状況が変化してしまうため、できれば現状のアプリケーションのままで検証が行えると良いと思っています。

ちなみにQtではdelete後にnullを設定することでガベージコレクションの対象になりやすくなるということがありますでしょうか?

アプリケーションのフリーズを調査するためのツールや手法等について御教授願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2018/10/05 03:09

フリーズというのは segment fault で落ちるということですか?
otn

2018/10/05 03:17

具体的な現象は何でしょうか?
LS_Takao

2018/10/05 04:33

tiitoi様、otn様 コメントありがとうございます。 漠然とした質問で申し訳ございません。 内容を加筆しました。
guest

回答1

0

考えられる可能性

  • マルチスレッドでの資源競合

→ 複数スレッドからアクセスする資源に関して、mutex lock をちゃんとかけているか
→ 試したことはないですが、valgrind で競合の検出はできるようです。

  • メモリの不正アクセス

→ 不正アクセスの場合は参照した値が変になるか、segmentation fault で落ちる場合がほとんどなので、今回の件と関係あるかは不明

  • メモリリーク

→ mtrace, valgrind で調べられます。簡単にであれば、アプリケーションを起動してしばらく放置してメモリ使用量が増えていってないか見てみる。

ちなみに Qt の注意点として、「UI へのアクセス (表示内容の更新など) はメインスレッド以外では行ってはいけない」という制約がありますが、その点は大丈夫でしょうか。
もし、他のスレッドからUIを更新したりした場合、動作未定義なので、うまくいくこともありますが、まったく更新できなくなったりします。

投稿2018/10/05 04:44

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LS_Takao

2018/10/05 05:08

tiitoi様 お教えいただいた「valgrind」による調査を行ってみます。 また、Qtの注意点についても確認してみます。 御回答いただきありがとうございました。
tiitoi

2018/10/05 10:19

質問の追記について > Qtではdelete後にnullを設定することでガベージコレクションの対象になりやすくなるということがありますでしょうか? C++ の言語にガレージコレクションの仕組みはありません。 スコープを抜けたら自動的に破棄されますが、new したものは delete しない限り、残ったままです。メモリリークにつながります。 ---- Qt ではコンストラクタの引数にポインタを渡すクラス等はポインタの所有権がオブジェクトに移るものがあります。その場合はこちらで delete する必要はありません。逆に delete してしまうと double free になってしまいます。 例: // ある QObject の子としてダイアログを作成 // この場合、親オブジェクトが破棄されるタイミングで、その配下の // オブジェクトは自動的に破棄される。 QDialog *dialog = new QDialog(this);
LS_Takao

2018/10/08 03:23

tiitoi様 追加の質問にご回答いただきありがとうございます。 > C++ の言語にガレージコレクションの仕組みはありません。 上記からdelete後のオブジェクトにnullを設定しても意味は無いと解釈しました。 > Qt ではコンストラクタの引数にポインタを渡すクラス等はポインタの所有権がオブジェクトに移るものがあります。 上記の観点でソースコードを確認してみます。 なお、「valgrind」はまだ試せていません。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問