Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


お世話になっております。

■Windows環境のLibreOffice4.0.3.3で_DEBUGを有効にする手順について

・前回ご報告させて頂いた手順に、一部誤りや漏れがあった様です。
_DEBUGを有効にしたい局面の殆どはメモリリークチェックだと思いますので、
訂正した手順は「■Windows環境のLibreOffice4.0.3.3でmsvcrtdを使用したメモリ
リークチェックの方法について」を参照願います。

■Windows環境のLibreOffice4.0.3.3でmsvcrtdを使用したメモリリークチェックの方法に
ついて

・newまたはmalloc()した行番号等はまだ表示出来て居ませんが、メモリリークを
検出する環境が出来ましたので、以下に手順を展開させて頂きます。
※一部調査が必要な項目がまだ残っています。
※茂木さんから教えて頂いた4.1のmsvctrdを有効にするパッチの方法は4.0.3.3では
問題が発生したため、一部パッチの修正内容を変更しています。

◆ステップ1:solenv\gbuild\gbuild.mkの修正
・「ifneq ($(COM),MSC)
gb_GLOBALDEFS += -D_DEBUG \」を
「ifeq ($(COM),MSC)
gb_GLOBALDEFS += -D_DEBUG \」に修正。
・gb_GLOBALDEFS += -D_HAS_ITERATOR_DEBUGGING=0を追加。
※_HAS_ITERATOR_DEBUGGING=0」はboostをVisualStudioのデバッグ
ビルドでビルドすると発生するエラーを回避するためのものです。
詳細は以下のURLを参照願います。
参考URL:
http://social.msdn.microsoft.com/Forums/vstudio/en-US/03087447-620f-402b-9182-0da5ae6bf61f/boostmultiarray-vs2010debug

◆ステップ2:solenv\gbuild\framework\com_MSC_defs.mkの修正
・MDをMDdに変更。
gb_CFLAGS := \
(中略)
-MDd \
(中略)
gb_CXXFLAGS := \
(中略)
-MDd \
(以下略)

◆ステップ3:autoge.shの実行

・--enable-dbgutilを付加して実行。

◆ステップ4:Externalモジュールのメイクファイルの修正
・ExternalProject_Externalモジュール名.mk <http://xn--yck6dky8fx60y.mk>
の「/p:Configuration=Release」を
「/p:Configuration=Debug」に修正。
・ExternalPackage_Externalモジュール名.mk <http://xn--yck6dky8fx60y.mk>の「#$(eval
$(call gb_ExternalPackage_add_file」
のパラメータに渡されているパスのReleaseをDebugに修正。
※少なくともlibcdr,libwpd,libmspub,libvisio,liborcusに同様の修正が必要。
※liborcusの場合はPackage_liborcus.mkを修正する。
・ExternalProject_lcms2.mkの「/p:Configuration=Release」を
「/p:Configuration=Debug」に修正。
・ExternalPackage_lcms2.mkのlcms2.dllをlcms2d.dllに修正。
else ifeq ($(COM),MSC)
$(eval $(call
gb_ExternalPackage_add_file,lcms2,lib/lcms2.lib,bin/lcms2.lib))
$(eval $(call
gb_ExternalPackage_add_file,lcms2,bin/lcms2d.dll,bin/lcms2d.dll))
endif

◆ステップ5:python3モジュールのメイクファイルの修正
・ExternalProject_python3.mkの「/p:Configuration=Release」を
「/p:Configuration=Debug」に修正。
・python3\ExternalPackage_python3.mkのlib,dll,pyd名に_dを付加します。
※_d.lib,_d.dll,_d.pydに変更します。

◆ステップ6:ハードコーディングされているmsvcprtの修正
・全てのmkファイルをgrepし、msvcprtをmsvcprtdに変更する。

◆ステップ7:ビルドの実行
・/opt/lo/bin/make -sr debug=true ENABLE_SYMBOLS=true dev-install  2>&1 |
tee build`date +%y%m%d-%H%M`.log
・ビルドエラーが発生した時点で、適宜以下のステップの修正を行います。

◆ステップ8:python3モジュールのソリューションファイルの修正
・workdir\wntmsci14\UnpackedTarball\python3\PCbuild\pcbuild.slnを
Visual Studio 2012 Express for Desktopで開きます。
・構成プロパティのxxlimitedとpython3dllのReleaseをDebugに変更します。
・ターゲット名に_dを付加します。
・python3dllプロジェクトとxxlimitedプロジェクトのみリビルドします。
※もし_d付きで生成されなければ手動でコピーを作成します。

◆ステップ9:Externalモジュールのソリューションファイルの修正
・libcdr,libmspub,libvisio,libwpd,liborcusのソリューションファイルを
Visual Studio 2012 Express for Desktopで開いてプロジェクト変換します。
・上記ソリューションファイルの「追加のインクルードディレクトリ」に以下を
追加します。
\solver\wntmsci14\inc\external
solver\wntmsci14\inc\external\zlib
workdir\wntmsci14\UnpackedTarball\lcms2\include(libcdrのみ)
・上記ソリューションファイルの「プリプロセッサ」に以下を追加します。
_HAS_ITERATOR_DEBUGGING=0
BOOST_ALL_NO_LIB(liborcusのみ。オートリンク無効化マクロ。)
※BOOST_ALL_NO_LIBとはboostのオートリンク機能で、ライブラリ名が
変更されることを防ぐためのものだそうです。
・Visual Studio 2012 Express for Desktopでリビルドします。
※liborcusはliborcus-static-nozipのみリビルドします。debug\orcus.libが
生成されるのでILIB環境変数が指すディレクトリにコピーします。
(ILIB環境変数の定義はconfig.statusに記載されています)

◆ステップ10:unittestの無効化(要原因調査)
・ビルドエラーを起こすunittestを無効化します。
具体的にはModule_モジュール名.mkの
「$(eval $(call gb_Module_add_check_targets,モジュール名,\」の行をコメントアウト
します。
※これも原因がまだわかっていませんが、ビルド中にユニットテストに失敗するため
コメントアウトしています。

◆ステップ11:xmlsecurity\source\xmlsec\nss\nssinitializer.cxxの修正
・undefされている_DEBUGを有効にします。
/*
* Turn off DEBUG Assertions
*/
#ifdef _DEBUG
   #define _DEBUG_WAS_DEFINED _DEBUG
// free.toolcreator del start
//    #undef _DEBUG
// free.toolcreator del end
#else
   #undef _DEBUG_WAS_DEFINED
#endif

◆ステップ12:setup_native\source\win32\customactions\shellextensions\copyeditiondata.cxxの修正
・std::nothrowはデバッグビルドでは有効とならない様なので無効にします。
wchar_t * getProperty(
   MSIHANDLE install, wchar_t const * name, wchar_t const * suffix,
   std::size_t suffixLength, wchar_t ** end = NULL)
{
   DWORD n = 0;
   UINT err = MsiGetPropertyW(install, name, L"", &n);
   if (err != ERROR_SUCCESS && err != ERROR_MORE_DATA) {
       return NULL;
   }
   DWORD n2 = n + suffixLength; //TODO: overflow
// free.toolcreator mod start
//    wchar_t * data = new(std::nothrow) wchar_t[n2];
#ifdef _DEBUG
   wchar_t * data = new wchar_t[n2];
#else
   wchar_t * data = new(std::nothrow) wchar_t[n2];
#endif
// free.toolcreator mod end
   if (data == NULL) {

◆ステップ13:setup_native\source\win32\customactions\regpatchactivex\makefile.mk
の修正
・ msvcrtd.libを追加します。
.IF "$(COM)"!="GCC"
# free.toolcreator mod start
#SHL1STDLIBS+= libcmt.lib
SHL1STDLIBS+= libcmt.lib msvcrtd.lib
# free.toolcreator mod end
.ENDIF

◆ステップ14:solver\wntmsci14\bin配下のlcms2d.dll,python3_d.dll,python33_d.dllのコピー
・ それぞれdまたは_dを消したdll名で同ディレクトリにコピーします。
※これを実行しないと、instsetoo_nativeのビルドで失敗します。


■作成した環境でのメモリリーク実行結果

◆操作手順
・solver/wntmsci14/installation/opt/program/sofficeを実行し、LibreOffice起動後終了する。

◆リークチェック結果


・結論から言うと、起動して終了しただけなのに約88KBリークしています。
以下が結果です。
スレッド 0x828c はコード 0 (0x0) で終了しました。
Detected memory leaks!
Dumping objects ->
{306116} normal block at 0x09224A00, 32 bytes long.

Data: < J"  J"  J"     > 00 4A 22 09 00 4A 22 09 00 4A 22 09 01 01 CD CD
{306115} normal block at 0x09222EA0, 32 bytes long.
Data: < ."  ."  ."     > A0 2E 22 09 A0 2E 22 09 A0 2E 22 09 01 01 CD CD

(中略)

{628} normal block at 0x002C6758, 40 bytes long.
Data: <X , pL-         > 58 A3 2C 00 70 4C 2D 09 0B 00 00 00 CD CD CD CD
{615} normal block at 0x002CA250, 24 bytes long.
Data: < `  x Y         > E4 60 F0 00 78 E8 59 09 00 00 00 00 00 00 00 00

{213} normal block at 0x002B3128, 32 bytes long.
Data: <                > E8 E0 F0 00 0B 00 00 00 CD CD CD CD 00 CD CD CD
Object dump complete.
プログラム '[0xF414] soffice.bin' はコード 0 (0x0) で終了しました。


■他のメモリリークチェック方法について

・以前茂木さんから教わったURLに記載のプログラムでリークチェックを行いました。
◆Puryfy

・試用版で確認してみましたが、拡張子がexeでないとチェック出来ないようです。
そのため、soffice.binの確認が出来ませんでした。

◆Insure++

・試用版のインストールで何故か失敗するので検証出来ませんでした。


◆Dr.Memory

・どうやらPDBからソースファイルの情報を読み取っている様で、PDBファイルさえ
作っておけばReleaseモードでもリークチェック可能な様です。
実行結果を一部抜粋します。

Error #1: LEAK 422 direct bytes 0x00588ff8-0x0058919e + 0 indirect bytes
# 0 KERNELBASE.dll!LocalAlloc +0x5e (0x752458de <KERNELBASE.dll+0x158de>)
# 1 SHELL32.dll!CommandLineToArgvW +0x89 (0x76589f22 <SHELL32.dll+0x19f22>)
# 2 GetCommandArgs
[c:\cygwin\home\test\libreoffice-4.0.3.3\desktop\win32\source\officeloader\officeloader.cxx:122]
# 3 wWinMain
[c:\cygwin\home\test\libreoffice-4.0.3.3\desktop\win32\source\officeloader\officeloader.cxx:322]
Error #2: LEAK 422 direct bytes 0x00589440-0x005895e6 + 0 indirect bytes
# 0 KERNELBASE.dll!LocalAlloc +0x5e (0x752458de <KERNELBASE.dll+0x158de>)
# 1 SHELL32.dll!CommandLineToArgvW +0x89 (0x76589f22 <SHELL32.dll+0x19f22>)
# 2 GetCommandArgs
[c:\cygwin\home\test\libreoffice-4.0.3.3\desktop\win32\source\officeloader\officeloader.cxx:122]
# 3 wWinMain
[c:\cygwin\home\test\libreoffice-4.0.3.3\desktop\win32\source\officeloader\officeloader.cxx:364]



(どうやらGetCommandArgs()の戻り値のメモリをGlobalFreeもしくはLocalFreeしていない
メモリリークがある様です)

但し、意図的に作りこんだメモリリークは検出出来ませんでした。
※Dr.Memoryには推奨するコンパイラオプションというものが有るようで、
そのオプションを満足していないために検出出来ないのかもしれません。
参考URL:http://www.drmemory.org/docs/page_prep.html
※cl /Zi /MT /EHsc /Oy- /Ob0 /Femyapp.exe *.cppと記載されて
いるので、/MTdとは混在出来ない様です。
Releaseビルド+PDB環境でも検証してみます。

以上です。

-- 
Unsubscribe instructions: E-mail to discuss+unsubscribe@ja.libreoffice.org
Posting guidelines + more: http://wiki.documentfoundation.org/Netiquette
List archive: http://listarchives.libreoffice.org/ja/discuss/
All messages sent to this list will be publicly archived and cannot be deleted

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.