diff options
author | Jacek Antonelli | 2009-05-30 17:16:26 -0500 |
---|---|---|
committer | Jacek Antonelli | 2009-05-30 19:12:37 -0500 |
commit | 499afbab7be4c4136eea0e1897319c3ac4e9799d (patch) | |
tree | 95e9de524994eae69b0dd88b8c6608d5f45d030c /linden/indra/newview/llwindebug.cpp | |
parent | Fixed end-of-line style for Info-Imprudence.plist. (diff) | |
parent | Second Life viewer sources 1.22.11 (diff) | |
download | meta-impy-499afbab7be4c4136eea0e1897319c3ac4e9799d.zip meta-impy-499afbab7be4c4136eea0e1897319c3ac4e9799d.tar.gz meta-impy-499afbab7be4c4136eea0e1897319c3ac4e9799d.tar.bz2 meta-impy-499afbab7be4c4136eea0e1897319c3ac4e9799d.tar.xz |
Merged SL 1.22.11 into Imprudence 1.1 RC2.
Conflicts:
linden/doc/contributions.txt
linden/indra/cmake/APR.cmake
linden/indra/cmake/CopyWinLibs.cmake
linden/indra/cmake/LLKDU.cmake (removed)
linden/indra/cmake/LLMedia.cmake
linden/indra/cmake/OPENAL.cmake
linden/indra/cmake/QuickTime.cmake (removed)
linden/indra/develop.py
linden/indra/lib/python/indra/base/llsd.py
linden/indra/lib/python/indra/util/fastest_elementtree.py
linden/indra/lib/python/indra/util/llmanifest.py
linden/indra/lib/python/indra/util/named_query.py
linden/indra/llaudio/CMakeLists.txt
linden/indra/llaudio/audioengine.cpp
linden/indra/llaudio/audioengine.h
linden/indra/llaudio/audioengine_fmod.cpp
linden/indra/llaudio/audioengine_fmod.h
linden/indra/llaudio/audioengine_openal.cpp
linden/indra/llaudio/audioengine_openal.h
linden/indra/llaudio/listener_openal.cpp
linden/indra/llaudio/listener_openal.h
linden/indra/llaudio/windgen.h
linden/indra/llcrashlogger/llcrashlogger.cpp
linden/indra/llmedia/llmediaimplgstreamer.cpp
linden/indra/llmedia/llmediaimplgstreamer_syms.cpp (removed)
linden/indra/llmedia/llmediaimplgstreamer_syms.h (removed)
linden/indra/llmessage/llcircuit.h
linden/indra/llrender/llgl.cpp
linden/indra/llrender/llrender.h
linden/indra/llui/llfloater.cpp
linden/indra/llui/lltexteditor.cpp
linden/indra/llwindow/llwindowsdl.cpp
linden/indra/mac_crash_logger/CMakeLists.txt
linden/indra/mac_updater/CMakeLists.txt
linden/indra/newview/CMakeLists.txt
linden/indra/newview/English.lproj/InfoPlist.strings
linden/indra/newview/Info-Imprudence.plist
linden/indra/newview/installers/windows/installer_template.nsi
linden/indra/newview/installers/windows/lang_de.nsi
linden/indra/newview/installers/windows/lang_en-us.nsi
linden/indra/newview/installers/windows/lang_ja.nsi
linden/indra/newview/installers/windows/lang_ko.nsi
linden/indra/newview/llappviewer.cpp
linden/indra/newview/llaudiosourcevo.cpp
linden/indra/newview/llfloaterabout.cpp
linden/indra/newview/llfloaterhtml.cpp
linden/indra/newview/llfloaterhtml.h
linden/indra/newview/llfloaterinspect.cpp
linden/indra/newview/llfloatersnapshot.cpp
linden/indra/newview/llpanelgeneral.cpp
linden/indra/newview/llpanelgeneral.h
linden/indra/newview/llpanellogin.cpp
linden/indra/newview/llpanelobject.cpp
linden/indra/newview/llurlhistory.cpp
linden/indra/newview/llviewermenu.cpp
linden/indra/newview/llviewernetwork.cpp
linden/indra/newview/llviewernetwork.h
linden/indra/newview/llviewerobject.cpp
linden/indra/newview/llviewerwindow.cpp
linden/indra/newview/llvoavatar.cpp
linden/indra/newview/res/viewerRes.rc
linden/indra/newview/skins/default/xui/de/floater_env_settings.xml
linden/indra/newview/skins/default/xui/de/floater_html.xml
linden/indra/newview/skins/default/xui/de/floater_inspect.xml
linden/indra/newview/skins/default/xui/de/floater_instant_message_group.xml
linden/indra/newview/skins/default/xui/de/floater_lagmeter.xml
linden/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
linden/indra/newview/skins/default/xui/de/floater_url_entry.xml
linden/indra/newview/skins/default/xui/de/floater_water.xml
linden/indra/newview/skins/default/xui/de/mime_types.xml
linden/indra/newview/skins/default/xui/de/need_to_long.xml
linden/indra/newview/skins/default/xui/de/need_to_translate.xml
linden/indra/newview/skins/default/xui/de/need_to_update.xml
linden/indra/newview/skins/default/xui/de/panel_friends.xml
linden/indra/newview/skins/default/xui/de/panel_media_remote_expanded.xml
linden/indra/newview/skins/default/xui/de/panel_preferences_voice.xml
linden/indra/newview/skins/default/xui/de/panel_voice_controls.xml
linden/indra/newview/skins/default/xui/de/panel_voice_enable.xml
linden/indra/newview/skins/default/xui/de/panel_voice_options.xml
linden/indra/newview/skins/default/xui/de/strings.xml
linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
linden/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc.xml
linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
linden/indra/newview/skins/default/xui/en-us/floater_lagmeter.xml
linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
linden/indra/newview/skins/default/xui/en-us/panel_audio_device.xml
linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
linden/indra/newview/skins/default/xui/en-us/panel_preferences_input.xml
linden/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml
linden/indra/newview/skins/default/xui/en-us/panel_voice_remote.xml
linden/indra/newview/skins/default/xui/en-us/panel_voice_remote_expanded.xml
linden/indra/newview/skins/default/xui/es/alerts.xml
linden/indra/newview/skins/default/xui/es/floater_about_land.xml
linden/indra/newview/skins/default/xui/es/floater_mute.xml
linden/indra/newview/skins/default/xui/es/menu_viewer.xml
linden/indra/newview/skins/default/xui/es/panel_group_land_money.xml
linden/indra/newview/skins/default/xui/es/panel_preferences_general.xml
linden/indra/newview/skins/default/xui/fr/alerts.xml
linden/indra/newview/skins/default/xui/fr/floater_about.xml
linden/indra/newview/skins/default/xui/fr/floater_about_land.xml
linden/indra/newview/skins/default/xui/fr/floater_active_speakers.xml
linden/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
linden/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
linden/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml
linden/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
linden/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
linden/indra/newview/skins/default/xui/fr/floater_buy_land.xml
linden/indra/newview/skins/default/xui/fr/floater_buy_object.xml
linden/indra/newview/skins/default/xui/fr/floater_chat_history.xml
linden/indra/newview/skins/default/xui/fr/floater_color_picker.xml
linden/indra/newview/skins/default/xui/fr/floater_customize.xml
linden/indra/newview/skins/default/xui/fr/floater_directory.xml
linden/indra/newview/skins/default/xui/fr/floater_env_settings.xml
linden/indra/newview/skins/default/xui/fr/floater_god_tools.xml
linden/indra/newview/skins/default/xui/fr/floater_group_info.xml
linden/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
linden/indra/newview/skins/default/xui/fr/floater_html.xml
linden/indra/newview/skins/default/xui/fr/floater_image_preview.xml
linden/indra/newview/skins/default/xui/fr/floater_import.xml
linden/indra/newview/skins/default/xui/fr/floater_instant_message.xml
linden/indra/newview/skins/default/xui/fr/floater_instant_message_ad_hoc.xml
linden/indra/newview/skins/default/xui/fr/floater_instant_message_group.xml
linden/indra/newview/skins/default/xui/fr/floater_inventory.xml
linden/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
linden/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
linden/indra/newview/skins/default/xui/fr/floater_joystick.xml
linden/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
linden/indra/newview/skins/default/xui/fr/floater_land_holdings.xml
linden/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml
linden/indra/newview/skins/default/xui/fr/floater_media_browser.xml
linden/indra/newview/skins/default/xui/fr/floater_moveview.xml
linden/indra/newview/skins/default/xui/fr/floater_mute.xml
linden/indra/newview/skins/default/xui/fr/floater_mute_object.xml
linden/indra/newview/skins/default/xui/fr/floater_name_description.xml
linden/indra/newview/skins/default/xui/fr/floater_new_outfit_dialog.xml
linden/indra/newview/skins/default/xui/fr/floater_openobject.xml
linden/indra/newview/skins/default/xui/fr/floater_pay.xml
linden/indra/newview/skins/default/xui/fr/floater_pay_object.xml
linden/indra/newview/skins/default/xui/fr/floater_preferences.xml
linden/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
linden/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
linden/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml
linden/indra/newview/skins/default/xui/fr/floater_preview_notecard_keep_discard.xml
linden/indra/newview/skins/default/xui/fr/floater_preview_sound.xml
linden/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml
linden/indra/newview/skins/default/xui/fr/floater_region_info.xml
linden/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
linden/indra/newview/skins/default/xui/fr/floater_report_bug.xml
linden/indra/newview/skins/default/xui/fr/floater_script_ed_panel.xml
linden/indra/newview/skins/default/xui/fr/floater_sell_land.xml
linden/indra/newview/skins/default/xui/fr/floater_settings_debug.xml
linden/indra/newview/skins/default/xui/fr/floater_skin_preview_template.xml
linden/indra/newview/skins/default/xui/fr/floater_snapshot.xml
linden/indra/newview/skins/default/xui/fr/floater_sound_preview.xml
linden/indra/newview/skins/default/xui/fr/floater_telehub.xml
linden/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
linden/indra/newview/skins/default/xui/fr/floater_tools.xml
linden/indra/newview/skins/default/xui/fr/floater_top_objects.xml
linden/indra/newview/skins/default/xui/fr/floater_url_entry.xml
linden/indra/newview/skins/default/xui/fr/floater_windlight_options.xml
linden/indra/newview/skins/default/xui/fr/floater_world_map.xml
linden/indra/newview/skins/default/xui/fr/menu_inventory.xml
linden/indra/newview/skins/default/xui/fr/menu_pie_avatar.xml
linden/indra/newview/skins/default/xui/fr/menu_pie_land.xml
linden/indra/newview/skins/default/xui/fr/menu_pie_self.xml
linden/indra/newview/skins/default/xui/fr/menu_viewer.xml
linden/indra/newview/skins/default/xui/fr/mime_types.xml
linden/indra/newview/skins/default/xui/fr/notify.xml
linden/indra/newview/skins/default/xui/fr/panel_audio.xml
linden/indra/newview/skins/default/xui/fr/panel_audio_device.xml
linden/indra/newview/skins/default/xui/fr/panel_avatar.xml
linden/indra/newview/skins/default/xui/fr/panel_avatar_classified.xml
linden/indra/newview/skins/default/xui/fr/panel_chat_bar.xml
linden/indra/newview/skins/default/xui/fr/panel_classified.xml
linden/indra/newview/skins/default/xui/fr/panel_event.xml
linden/indra/newview/skins/default/xui/fr/panel_friends.xml
linden/indra/newview/skins/default/xui/fr/panel_group.xml
linden/indra/newview/skins/default/xui/fr/panel_group_finder.xml
linden/indra/newview/skins/default/xui/fr/panel_group_general.xml
linden/indra/newview/skins/default/xui/fr/panel_group_invite.xml
linden/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
linden/indra/newview/skins/default/xui/fr/panel_group_notices.xml
linden/indra/newview/skins/default/xui/fr/panel_group_roles.xml
linden/indra/newview/skins/default/xui/fr/panel_group_voting.xml
linden/indra/newview/skins/default/xui/fr/panel_groups.xml
linden/indra/newview/skins/default/xui/fr/panel_login.xml
linden/indra/newview/skins/default/xui/fr/panel_master_volume.xml
linden/indra/newview/skins/default/xui/fr/panel_media_controls.xml
linden/indra/newview/skins/default/xui/fr/panel_media_remote.xml
linden/indra/newview/skins/default/xui/fr/panel_media_remote_expanded.xml
linden/indra/newview/skins/default/xui/fr/panel_overlaybar.xml
linden/indra/newview/skins/default/xui/fr/panel_place.xml
linden/indra/newview/skins/default/xui/fr/panel_place_small.xml
linden/indra/newview/skins/default/xui/fr/panel_preferences_audio.xml
linden/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
linden/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
linden/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
linden/indra/newview/skins/default/xui/fr/panel_preferences_im.xml
linden/indra/newview/skins/default/xui/fr/panel_preferences_input.xml
linden/indra/newview/skins/default/xui/fr/panel_preferences_network.xml
linden/indra/newview/skins/default/xui/fr/panel_preferences_popups.xml
linden/indra/newview/skins/default/xui/fr/panel_preferences_voice.xml
linden/indra/newview/skins/default/xui/fr/panel_preferences_web.xml
linden/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
linden/indra/newview/skins/default/xui/fr/panel_region_debug.xml
linden/indra/newview/skins/default/xui/fr/panel_region_estate.xml
linden/indra/newview/skins/default/xui/fr/panel_region_general.xml
linden/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
linden/indra/newview/skins/default/xui/fr/panel_scrolling_param.xml
linden/indra/newview/skins/default/xui/fr/panel_speaker_controls.xml
linden/indra/newview/skins/default/xui/fr/panel_status_bar.xml
linden/indra/newview/skins/default/xui/fr/panel_toolbar.xml
linden/indra/newview/skins/default/xui/fr/panel_voice_controls.xml
linden/indra/newview/skins/default/xui/fr/panel_voice_enable.xml
linden/indra/newview/skins/default/xui/fr/panel_voice_options.xml
linden/indra/newview/skins/default/xui/fr/panel_voice_remote_expanded.xml
linden/indra/newview/skins/default/xui/fr/role_actions.xml
linden/indra/newview/skins/default/xui/fr/strings.xml
linden/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
linden/indra/newview/skins/default/xui/ja/floater_inspect.xml
linden/indra/newview/skins/default/xui/ja/floater_instant_message_group.xml
linden/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml
linden/indra/newview/skins/default/xui/ja/floater_media_browser.xml
linden/indra/newview/skins/default/xui/ja/floater_mute_object.xml
linden/indra/newview/skins/default/xui/ja/floater_url_entry.xml
linden/indra/newview/skins/default/xui/ja/need_to_long.xml
linden/indra/newview/skins/default/xui/ja/need_to_translate.xml
linden/indra/newview/skins/default/xui/ja/need_to_update.xml
linden/indra/newview/skins/default/xui/ja/panel_audio.xml
linden/indra/newview/skins/default/xui/ja/panel_groups.xml
linden/indra/newview/skins/default/xui/ja/panel_preferences_voice.xml
linden/indra/newview/skins/default/xui/ja/panel_preferences_web.xml
linden/indra/newview/skins/default/xui/ja/strings.xml
linden/indra/newview/skins/default/xui/ko/need_to_long.xml
linden/indra/newview/skins/default/xui/ko/need_to_translate.xml
linden/indra/newview/skins/default/xui/ko/need_to_update.xml
linden/indra/newview/skins/default/xui/pt/alerts.xml
linden/indra/newview/skins/default/xui/pt/floater_about.xml
linden/indra/newview/skins/default/xui/pt/floater_about_land.xml
linden/indra/newview/skins/default/xui/pt/floater_animation_preview.xml
linden/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml
linden/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml
linden/indra/newview/skins/default/xui/pt/floater_build_options.xml
linden/indra/newview/skins/default/xui/pt/floater_buy_contents.xml
linden/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
linden/indra/newview/skins/default/xui/pt/floater_buy_land.xml
linden/indra/newview/skins/default/xui/pt/floater_buy_object.xml
linden/indra/newview/skins/default/xui/pt/floater_chat_history.xml
linden/indra/newview/skins/default/xui/pt/floater_color_picker.xml
linden/indra/newview/skins/default/xui/pt/floater_customize.xml
linden/indra/newview/skins/default/xui/pt/floater_directory.xml
linden/indra/newview/skins/default/xui/pt/floater_gesture.xml
linden/indra/newview/skins/default/xui/pt/floater_html.xml
linden/indra/newview/skins/default/xui/pt/floater_im.xml
linden/indra/newview/skins/default/xui/pt/floater_image_preview.xml
linden/indra/newview/skins/default/xui/pt/floater_instant_message.xml
linden/indra/newview/skins/default/xui/pt/floater_instant_message_ad_hoc.xml
linden/indra/newview/skins/default/xui/pt/floater_inventory.xml
linden/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
linden/indra/newview/skins/default/xui/pt/floater_joystick.xml
linden/indra/newview/skins/default/xui/pt/floater_land_holdings.xml
linden/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml
linden/indra/newview/skins/default/xui/pt/floater_mute.xml
linden/indra/newview/skins/default/xui/pt/floater_new_outfit_dialog.xml
linden/indra/newview/skins/default/xui/pt/floater_openobject.xml
linden/indra/newview/skins/default/xui/pt/floater_pay.xml
linden/indra/newview/skins/default/xui/pt/floater_pay_object.xml
linden/indra/newview/skins/default/xui/pt/floater_postcard.xml
linden/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
linden/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
linden/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml
linden/indra/newview/skins/default/xui/pt/floater_preview_notecard_keep_discard.xml
linden/indra/newview/skins/default/xui/pt/floater_report_abuse.xml
linden/indra/newview/skins/default/xui/pt/floater_report_bug.xml
linden/indra/newview/skins/default/xui/pt/floater_script_debug.xml
linden/indra/newview/skins/default/xui/pt/floater_script_ed_panel.xml
linden/indra/newview/skins/default/xui/pt/floater_snapshot.xml
linden/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
linden/indra/newview/skins/default/xui/pt/floater_tools.xml
linden/indra/newview/skins/default/xui/pt/floater_top_objects.xml
linden/indra/newview/skins/default/xui/pt/floater_tos.xml
linden/indra/newview/skins/default/xui/pt/floater_world_map.xml
linden/indra/newview/skins/default/xui/pt/menu_inventory.xml
linden/indra/newview/skins/default/xui/pt/menu_pie_avatar.xml
linden/indra/newview/skins/default/xui/pt/menu_viewer.xml
linden/indra/newview/skins/default/xui/pt/notify.xml
linden/indra/newview/skins/default/xui/pt/panel_avatar.xml
linden/indra/newview/skins/default/xui/pt/panel_avatar_classified.xml
linden/indra/newview/skins/default/xui/pt/panel_chat_bar.xml
linden/indra/newview/skins/default/xui/pt/panel_classified.xml
linden/indra/newview/skins/default/xui/pt/panel_event.xml
linden/indra/newview/skins/default/xui/pt/panel_group_general.xml
linden/indra/newview/skins/default/xui/pt/panel_group_invite.xml
linden/indra/newview/skins/default/xui/pt/panel_group_land_money.xml
linden/indra/newview/skins/default/xui/pt/panel_group_notices.xml
linden/indra/newview/skins/default/xui/pt/panel_group_roles.xml
linden/indra/newview/skins/default/xui/pt/panel_group_voting.xml
linden/indra/newview/skins/default/xui/pt/panel_login.xml
linden/indra/newview/skins/default/xui/pt/panel_overlaybar.xml
linden/indra/newview/skins/default/xui/pt/panel_place.xml
linden/indra/newview/skins/default/xui/pt/panel_place_small.xml
linden/indra/newview/skins/default/xui/pt/panel_preferences_audio.xml
linden/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
linden/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
linden/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
linden/indra/newview/skins/default/xui/pt/panel_preferences_im.xml
linden/indra/newview/skins/default/xui/pt/panel_preferences_input.xml
linden/indra/newview/skins/default/xui/pt/panel_preferences_network.xml
linden/indra/newview/skins/default/xui/pt/panel_preferences_popups.xml
linden/indra/newview/skins/default/xui/pt/panel_preferences_web.xml
linden/indra/newview/skins/default/xui/pt/panel_region_covenant.xml
linden/indra/newview/skins/default/xui/pt/panel_region_debug.xml
linden/indra/newview/skins/default/xui/pt/panel_region_estate.xml
linden/indra/newview/skins/default/xui/pt/panel_region_general.xml
linden/indra/newview/skins/default/xui/pt/panel_status_bar.xml
linden/indra/newview/skins/default/xui/pt/panel_toolbar.xml
linden/indra/newview/skins/default/xui/pt/teleport_strings.xml
linden/indra/newview/skins/default/xui/zh/floater_account_history.xml
linden/indra/newview/skins/default/xui/zh/floater_god_tools.xml
linden/indra/newview/skins/default/xui/zh/floater_html.xml
linden/indra/newview/skins/default/xui/zh/floater_inspect.xml
linden/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml
linden/indra/newview/skins/default/xui/zh/floater_preferences.xml
linden/indra/newview/skins/default/xui/zh/floater_sell_land.xml
linden/indra/newview/skins/default/xui/zh/floater_settings_debug.xml
linden/indra/newview/skins/default/xui/zh/menu_pie_attachment.xml
linden/indra/newview/skins/default/xui/zh/menu_pie_avatar.xml
linden/indra/newview/skins/default/xui/zh/menu_pie_land.xml
linden/indra/newview/skins/default/xui/zh/menu_pie_object.xml
linden/indra/newview/skins/default/xui/zh/menu_pie_self.xml
linden/indra/newview/skins/default/xui/zh/menu_viewer.xml
linden/indra/newview/skins/default/xui/zh/need_to_translate.xml
linden/indra/newview/skins/default/xui/zh/panel_account_details.xml
linden/indra/newview/skins/default/xui/zh/panel_account_planning.xml
linden/indra/newview/skins/default/xui/zh/panel_account_transactions.xml
linden/indra/newview/skins/default/xui/zh/panel_avatar.xml
linden/indra/newview/skins/default/xui/zh/panel_group.xml
linden/indra/newview/skins/default/xui/zh/panel_group_finder.xml
linden/indra/newview/skins/default/xui/zh/panel_group_general.xml
linden/indra/newview/skins/default/xui/zh/panel_group_invite.xml
linden/indra/newview/skins/default/xui/zh/panel_group_land_money.xml
linden/indra/newview/skins/default/xui/zh/panel_group_notices.xml
linden/indra/newview/skins/default/xui/zh/panel_group_roles.xml
linden/indra/newview/skins/default/xui/zh/panel_group_voting.xml
linden/indra/newview/skins/default/xui/zh/panel_preferences_audio.xml
linden/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml
linden/indra/newview/skins/default/xui/zh/panel_preferences_im.xml
linden/indra/newview/skins/default/xui/zh/panel_preferences_popups.xml
linden/indra/newview/skins/default/xui/zh/panel_region_covenant.xml
linden/indra/newview/skins/default/xui/zh/strings.xml
linden/indra/newview/skins/default/xui/zh/strings_long.xml
linden/indra/newview/skins/silver/xui/en-us/floater_about_land.xml
linden/indra/newview/skins/silver/xui/en-us/panel_status_bar.xml
linden/indra/newview/viewer_manifest.py
linden/indra/win_updater/updater.cpp
linden/install.xml
Diffstat (limited to 'linden/indra/newview/llwindebug.cpp')
-rw-r--r-- | linden/indra/newview/llwindebug.cpp | 356 |
1 files changed, 264 insertions, 92 deletions
diff --git a/linden/indra/newview/llwindebug.cpp b/linden/indra/newview/llwindebug.cpp index e48b7bf..129d925 100644 --- a/linden/indra/newview/llwindebug.cpp +++ b/linden/indra/newview/llwindebug.cpp | |||
@@ -4,7 +4,7 @@ | |||
4 | * | 4 | * |
5 | * $LicenseInfo:firstyear=2004&license=viewergpl$ | 5 | * $LicenseInfo:firstyear=2004&license=viewergpl$ |
6 | * | 6 | * |
7 | * Copyright (c) 2004-2008, Linden Research, Inc. | 7 | * Copyright (c) 2004-2009, Linden Research, Inc. |
8 | * | 8 | * |
9 | * Second Life Viewer Source Code | 9 | * Second Life Viewer Source Code |
10 | * The source code in this file ("Source Code") is provided by Linden Lab | 10 | * The source code in this file ("Source Code") is provided by Linden Lab |
@@ -42,6 +42,7 @@ | |||
42 | #pragma warning(disable: 4200) //nonstandard extension used : zero-sized array in struct/union | 42 | #pragma warning(disable: 4200) //nonstandard extension used : zero-sized array in struct/union |
43 | #pragma warning(disable: 4100) //unreferenced formal parameter | 43 | #pragma warning(disable: 4100) //unreferenced formal parameter |
44 | 44 | ||
45 | |||
45 | /* | 46 | /* |
46 | LLSD Block for Windows Dump Information | 47 | LLSD Block for Windows Dump Information |
47 | <llsd> | 48 | <llsd> |
@@ -120,8 +121,18 @@ MODULE32_NEST Module32Next_; | |||
120 | #define CALL_TRACE_MAX ((DUMP_SIZE_MAX - 2000) / (MAX_PATH + 40)) //max number of traced calls | 121 | #define CALL_TRACE_MAX ((DUMP_SIZE_MAX - 2000) / (MAX_PATH + 40)) //max number of traced calls |
121 | #define NL L"\r\n" //new line | 122 | #define NL L"\r\n" //new line |
122 | 123 | ||
123 | BOOL WINAPI Get_Module_By_Ret_Addr(PBYTE Ret_Addr, LPWSTR Module_Name, PBYTE & Module_Addr); | ||
124 | 124 | ||
125 | typedef struct STACK | ||
126 | { | ||
127 | STACK * Ebp; | ||
128 | PBYTE Ret_Addr; | ||
129 | DWORD Param[0]; | ||
130 | } STACK, * PSTACK; | ||
131 | |||
132 | BOOL WINAPI Get_Module_By_Ret_Addr(PBYTE Ret_Addr, LPWSTR Module_Name, PBYTE & Module_Addr); | ||
133 | void WINAPI Get_Call_Stack(const EXCEPTION_RECORD* exception_record, | ||
134 | const CONTEXT* context_record, | ||
135 | LLSD& info); | ||
125 | 136 | ||
126 | void printError( CHAR* msg ) | 137 | void printError( CHAR* msg ) |
127 | { | 138 | { |
@@ -184,69 +195,6 @@ BOOL GetProcessThreadIDs(DWORD process_id, std::vector<DWORD>& thread_ids) | |||
184 | return( TRUE ); | 195 | return( TRUE ); |
185 | } | 196 | } |
186 | 197 | ||
187 | void WINAPI GetCallStackData(const CONTEXT* context_struct, LLSD& info) | ||
188 | { | ||
189 | // Fill Str with call stack info. | ||
190 | // pException can be either GetExceptionInformation() or NULL. | ||
191 | // If pException = NULL - get current call stack. | ||
192 | |||
193 | LPWSTR Module_Name = new WCHAR[MAX_PATH]; | ||
194 | PBYTE Module_Addr = 0; | ||
195 | |||
196 | typedef struct STACK | ||
197 | { | ||
198 | STACK * Ebp; | ||
199 | PBYTE Ret_Addr; | ||
200 | DWORD Param[0]; | ||
201 | } STACK, * PSTACK; | ||
202 | |||
203 | PSTACK Ebp; | ||
204 | |||
205 | if(context_struct) | ||
206 | { | ||
207 | Ebp = (PSTACK)context_struct->Ebp; | ||
208 | } | ||
209 | else | ||
210 | { | ||
211 | // The context struct is NULL, | ||
212 | // so we will use the current stack. | ||
213 | Ebp = (PSTACK)&context_struct - 1; | ||
214 | |||
215 | // Skip frame of GetCallStackData(). | ||
216 | if (!IsBadReadPtr(Ebp, sizeof(PSTACK))) | ||
217 | Ebp = Ebp->Ebp; //caller ebp | ||
218 | } | ||
219 | |||
220 | // Trace CALL_TRACE_MAX calls maximum - not to exceed DUMP_SIZE_MAX. | ||
221 | // Break trace on wrong stack frame. | ||
222 | for (int Ret_Addr_I = 0, i = 0; | ||
223 | (Ret_Addr_I < CALL_TRACE_MAX) && !IsBadReadPtr(Ebp, sizeof(PSTACK)) && !IsBadCodePtr(FARPROC(Ebp->Ret_Addr)); | ||
224 | Ret_Addr_I++, Ebp = Ebp->Ebp, ++i) | ||
225 | { | ||
226 | // If module with Ebp->Ret_Addr found. | ||
227 | |||
228 | if (Get_Module_By_Ret_Addr(Ebp->Ret_Addr, Module_Name, Module_Addr)) | ||
229 | { | ||
230 | // Save module's address and full path. | ||
231 | info["CallStack"][i]["ModuleName"] = ll_convert_wide_to_string(Module_Name); | ||
232 | info["CallStack"][i]["ModuleAddress"] = (int)Module_Addr; | ||
233 | info["CallStack"][i]["CallOffset"] = (int)(Ebp->Ret_Addr - Module_Addr); | ||
234 | |||
235 | LLSD params; | ||
236 | // Save 5 params of the call. We don't know the real number of params. | ||
237 | if (!IsBadReadPtr(Ebp, sizeof(PSTACK) + 5 * sizeof(DWORD))) | ||
238 | { | ||
239 | for(int j = 0; j < 5; ++j) | ||
240 | { | ||
241 | params[j] = (int)Ebp->Param[j]; | ||
242 | } | ||
243 | } | ||
244 | info["CallStack"][i]["Parameters"] = params; | ||
245 | } | ||
246 | info["CallStack"][i]["ReturnAddress"] = (int)Ebp->Ret_Addr; | ||
247 | } | ||
248 | } | ||
249 | |||
250 | BOOL GetThreadCallStack(DWORD thread_id, LLSD& info) | 198 | BOOL GetThreadCallStack(DWORD thread_id, LLSD& info) |
251 | { | 199 | { |
252 | if(GetCurrentThreadId() == thread_id) | 200 | if(GetCurrentThreadId() == thread_id) |
@@ -271,7 +219,7 @@ BOOL GetThreadCallStack(DWORD thread_id, LLSD& info) | |||
271 | context_struct.ContextFlags = CONTEXT_FULL; | 219 | context_struct.ContextFlags = CONTEXT_FULL; |
272 | if(GetThreadContext(thread_handle, &context_struct)) | 220 | if(GetThreadContext(thread_handle, &context_struct)) |
273 | { | 221 | { |
274 | GetCallStackData(&context_struct, info); | 222 | Get_Call_Stack(NULL, &context_struct, info); |
275 | result = true; | 223 | result = true; |
276 | } | 224 | } |
277 | ResumeThread(thread_handle); | 225 | ResumeThread(thread_handle); |
@@ -326,35 +274,143 @@ BOOL WINAPI Get_Module_By_Ret_Addr(PBYTE Ret_Addr, LPWSTR Module_Name, PBYTE & M | |||
326 | return found; | 274 | return found; |
327 | } //Get_Module_By_Ret_Addr | 275 | } //Get_Module_By_Ret_Addr |
328 | 276 | ||
277 | bool has_valid_call_before(PDWORD cur_stack_loc) | ||
278 | { | ||
279 | PBYTE p_first_byte = (PBYTE)(*cur_stack_loc - 1); | ||
280 | PBYTE p_second_byte = (PBYTE)(*cur_stack_loc -2); | ||
281 | PBYTE p_fifth_byte = (PBYTE)(*cur_stack_loc - 5); | ||
282 | PBYTE p_sixth_byte = (PBYTE)(*cur_stack_loc - 6); | ||
283 | |||
284 | // make sure we can read it | ||
285 | if(IsBadReadPtr(p_sixth_byte, 6 * sizeof(BYTE))) | ||
286 | { | ||
287 | return false; | ||
288 | } | ||
289 | |||
290 | // check for 9a + 4 bytes | ||
291 | if(*p_fifth_byte == 0x9A) | ||
292 | { | ||
293 | return true; | ||
294 | } | ||
295 | |||
296 | // Check for E8 + 4 bytes and last byte is 00 or FF | ||
297 | if(*p_fifth_byte == 0xE8 && (*p_first_byte == 0x00 || *p_first_byte == 0xFF)) | ||
298 | { | ||
299 | return true; | ||
300 | } | ||
301 | |||
302 | // the other is six bytes | ||
303 | if(*p_sixth_byte == 0xFF || *p_second_byte == 0xFF) | ||
304 | { | ||
305 | return true; | ||
306 | } | ||
307 | |||
308 | return false; | ||
309 | } | ||
310 | |||
311 | PBYTE get_valid_frame(PBYTE esp) | ||
312 | { | ||
313 | PDWORD cur_stack_loc = NULL; | ||
314 | const int max_search = 400; | ||
315 | WCHAR module_name[MAX_PATH]; | ||
316 | PBYTE module_addr = 0; | ||
317 | |||
318 | // round to highest multiple of four | ||
319 | esp = (esp + (4 - ((int)esp % 4)) % 4); | ||
320 | |||
321 | // scroll through stack a few hundred places. | ||
322 | for (cur_stack_loc = (PDWORD) esp; cur_stack_loc < (PDWORD)esp + max_search; cur_stack_loc += 1) | ||
323 | { | ||
324 | // if you can read the pointer, | ||
325 | if (IsBadReadPtr(cur_stack_loc, sizeof(PDWORD))) | ||
326 | { | ||
327 | continue; | ||
328 | } | ||
329 | |||
330 | // check if it's in a module | ||
331 | if (!Get_Module_By_Ret_Addr((PBYTE)*cur_stack_loc, module_name, module_addr)) | ||
332 | { | ||
333 | continue; | ||
334 | } | ||
335 | |||
336 | // check if the code before the instruction ptr is a call | ||
337 | if(!has_valid_call_before(cur_stack_loc)) | ||
338 | { | ||
339 | continue; | ||
340 | } | ||
341 | |||
342 | // if these all pass, return that ebp, otherwise continue till we're dead | ||
343 | return (PBYTE)(cur_stack_loc - 1); | ||
344 | } | ||
345 | |||
346 | return NULL; | ||
347 | } | ||
348 | |||
349 | bool shouldUseStackWalker(PSTACK Ebp, int max_depth) | ||
350 | { | ||
351 | WCHAR Module_Name[MAX_PATH]; | ||
352 | PBYTE Module_Addr = 0; | ||
353 | int depth = 0; | ||
354 | |||
355 | while (depth < max_depth) | ||
356 | { | ||
357 | if (IsBadReadPtr(Ebp, sizeof(PSTACK)) || | ||
358 | IsBadReadPtr(Ebp->Ebp, sizeof(PSTACK)) || | ||
359 | Ebp->Ebp < Ebp || | ||
360 | Ebp->Ebp - Ebp > 0xFFFFFF || | ||
361 | IsBadCodePtr(FARPROC(Ebp->Ebp->Ret_Addr)) || | ||
362 | !Get_Module_By_Ret_Addr(Ebp->Ebp->Ret_Addr, Module_Name, Module_Addr)) | ||
363 | { | ||
364 | return true; | ||
365 | } | ||
366 | depth++; | ||
367 | Ebp = Ebp->Ebp; | ||
368 | } | ||
369 | |||
370 | return false; | ||
371 | } | ||
372 | |||
329 | //****************************************************************** | 373 | //****************************************************************** |
330 | void WINAPI Get_Call_Stack(PEXCEPTION_POINTERS pException, LLSD& info) | 374 | void WINAPI Get_Call_Stack(const EXCEPTION_RECORD* exception_record, |
375 | const CONTEXT* context_record, | ||
376 | LLSD& info) | ||
331 | //****************************************************************** | 377 | //****************************************************************** |
332 | // Fill Str with call stack info. | 378 | // Fill Str with call stack info. |
333 | // pException can be either GetExceptionInformation() or NULL. | 379 | // pException can be either GetExceptionInformation() or NULL. |
334 | // If pException = NULL - get current call stack. | 380 | // If pException = NULL - get current call stack. |
335 | { | 381 | { |
336 | LPWSTR Module_Name = new WCHAR[MAX_PATH]; | 382 | LPWSTR Module_Name = new WCHAR[MAX_PATH]; |
337 | PBYTE Module_Addr = 0; | 383 | PBYTE Module_Addr = 0; |
338 | 384 | LLSD params; | |
339 | typedef struct STACK | 385 | PBYTE Esp = NULL; |
340 | { | 386 | LLSD tmp_info; |
341 | STACK * Ebp; | 387 | |
342 | PBYTE Ret_Addr; | 388 | bool fake_frame = false; |
343 | DWORD Param[0]; | 389 | bool ebp_used = false; |
344 | } STACK, * PSTACK; | 390 | const int HEURISTIC_MAX_WALK = 20; |
391 | int heuristic_walk_i = 0; | ||
392 | int Ret_Addr_I = 0; | ||
345 | 393 | ||
346 | STACK Stack = {0, 0}; | 394 | STACK Stack = {0, 0}; |
347 | PSTACK Ebp; | 395 | PSTACK Ebp; |
348 | 396 | ||
349 | if (pException) //fake frame for exception address | 397 | if (exception_record && context_record) //fake frame for exception address |
350 | { | 398 | { |
351 | Stack.Ebp = (PSTACK)pException->ContextRecord->Ebp; | 399 | Stack.Ebp = (PSTACK)(context_record->Ebp); |
352 | Stack.Ret_Addr = (PBYTE)pException->ExceptionRecord->ExceptionAddress; | 400 | Stack.Ret_Addr = (PBYTE)exception_record->ExceptionAddress; |
353 | Ebp = &Stack; | 401 | Ebp = &Stack; |
402 | Esp = (PBYTE) context_record->Esp; | ||
403 | fake_frame = true; | ||
404 | } | ||
405 | else if(context_record) | ||
406 | { | ||
407 | Ebp = (PSTACK)(context_record->Ebp); | ||
408 | Esp = (PBYTE)(context_record->Esp); | ||
354 | } | 409 | } |
355 | else | 410 | else |
356 | { | 411 | { |
357 | Ebp = (PSTACK)&pException - 1; //frame addr of Get_Call_Stack() | 412 | Ebp = (PSTACK)&exception_record - 1; //frame addr of Get_Call_Stack() |
413 | Esp = (PBYTE)&exception_record; | ||
358 | 414 | ||
359 | // Skip frame of Get_Call_Stack(). | 415 | // Skip frame of Get_Call_Stack(). |
360 | if (!IsBadReadPtr(Ebp, sizeof(PSTACK))) | 416 | if (!IsBadReadPtr(Ebp, sizeof(PSTACK))) |
@@ -363,22 +419,21 @@ void WINAPI Get_Call_Stack(PEXCEPTION_POINTERS pException, LLSD& info) | |||
363 | 419 | ||
364 | // Trace CALL_TRACE_MAX calls maximum - not to exceed DUMP_SIZE_MAX. | 420 | // Trace CALL_TRACE_MAX calls maximum - not to exceed DUMP_SIZE_MAX. |
365 | // Break trace on wrong stack frame. | 421 | // Break trace on wrong stack frame. |
366 | for (int Ret_Addr_I = 0, i = 0; | 422 | for (Ret_Addr_I = 0; |
367 | (Ret_Addr_I < CALL_TRACE_MAX) && !IsBadReadPtr(Ebp, sizeof(PSTACK)) && !IsBadCodePtr(FARPROC(Ebp->Ret_Addr)); | 423 | heuristic_walk_i < HEURISTIC_MAX_WALK && |
368 | Ret_Addr_I++, Ebp = Ebp->Ebp, ++i) | 424 | Ret_Addr_I < CALL_TRACE_MAX && !IsBadReadPtr(Ebp, sizeof(PSTACK)) && !IsBadCodePtr(FARPROC(Ebp->Ret_Addr)); |
425 | Ret_Addr_I++) | ||
369 | { | 426 | { |
370 | // If module with Ebp->Ret_Addr found. | 427 | // If module with Ebp->Ret_Addr found. |
371 | |||
372 | if (Get_Module_By_Ret_Addr(Ebp->Ret_Addr, Module_Name, Module_Addr)) | 428 | if (Get_Module_By_Ret_Addr(Ebp->Ret_Addr, Module_Name, Module_Addr)) |
373 | { | 429 | { |
374 | // Save module's address and full path. | 430 | // Save module's address and full path. |
375 | info["CallStack"][i]["ModuleName"] = ll_convert_wide_to_string(Module_Name); | 431 | tmp_info["CallStack"][Ret_Addr_I]["ModuleName"] = ll_convert_wide_to_string(Module_Name); |
376 | info["CallStack"][i]["ModuleAddress"] = (int)Module_Addr; | 432 | tmp_info["CallStack"][Ret_Addr_I]["ModuleAddress"] = (int)Module_Addr; |
377 | info["CallStack"][i]["CallOffset"] = (int)(Ebp->Ret_Addr - Module_Addr); | 433 | tmp_info["CallStack"][Ret_Addr_I]["CallOffset"] = (int)(Ebp->Ret_Addr - Module_Addr); |
378 | 434 | ||
379 | LLSD params; | ||
380 | // Save 5 params of the call. We don't know the real number of params. | 435 | // Save 5 params of the call. We don't know the real number of params. |
381 | if (pException && !Ret_Addr_I) //fake frame for exception address | 436 | if (fake_frame && !Ret_Addr_I) //fake frame for exception address |
382 | params[0] = "Exception Offset"; | 437 | params[0] = "Exception Offset"; |
383 | else if (!IsBadReadPtr(Ebp, sizeof(PSTACK) + 5 * sizeof(DWORD))) | 438 | else if (!IsBadReadPtr(Ebp, sizeof(PSTACK) + 5 * sizeof(DWORD))) |
384 | { | 439 | { |
@@ -387,10 +442,64 @@ void WINAPI Get_Call_Stack(PEXCEPTION_POINTERS pException, LLSD& info) | |||
387 | params[j] = (int)Ebp->Param[j]; | 442 | params[j] = (int)Ebp->Param[j]; |
388 | } | 443 | } |
389 | } | 444 | } |
390 | info["CallStack"][i]["Parameters"] = params; | 445 | tmp_info["CallStack"][Ret_Addr_I]["Parameters"] = params; |
391 | } | 446 | } |
392 | info["CallStack"][i]["ReturnAddress"] = (int)Ebp->Ret_Addr; | 447 | |
448 | tmp_info["CallStack"][Ret_Addr_I]["ReturnAddress"] = (int)Ebp->Ret_Addr; | ||
449 | |||
450 | // get ready for next frame | ||
451 | // Set ESP to just after return address. Not the real esp, but just enough after the return address | ||
452 | if(!fake_frame) { | ||
453 | Esp = (PBYTE)Ebp + 8; | ||
454 | } | ||
455 | else | ||
456 | { | ||
457 | fake_frame = false; | ||
458 | } | ||
459 | |||
460 | // is next ebp valid? | ||
461 | // only run if we've never found a good ebp | ||
462 | // and make sure the one after is valid as well | ||
463 | if( !ebp_used && | ||
464 | shouldUseStackWalker(Ebp, 2)) | ||
465 | { | ||
466 | heuristic_walk_i++; | ||
467 | PBYTE new_ebp = get_valid_frame(Esp); | ||
468 | if (new_ebp != NULL) | ||
469 | { | ||
470 | Ebp = (PSTACK)new_ebp; | ||
471 | } | ||
472 | } | ||
473 | else | ||
474 | { | ||
475 | ebp_used = true; | ||
476 | Ebp = Ebp->Ebp; | ||
477 | } | ||
478 | } | ||
479 | /* TODO remove or turn this code back on to edit the stack after i see a few raw ones. -Palmer | ||
480 | // Now go back through and edit out heuristic stacks that could very well be bogus. | ||
481 | // Leave the top and the last 3 stack chosen by the heuristic, however. | ||
482 | if(heuristic_walk_i > 2) | ||
483 | { | ||
484 | info["CallStack"][0] = tmp_info["CallStack"][0]; | ||
485 | std::string ttest = info["CallStack"][0]["ModuleName"]; | ||
486 | for(int cur_frame = 1; | ||
487 | (cur_frame + heuristic_walk_i - 2 < Ret_Addr_I); | ||
488 | ++cur_frame) | ||
489 | { | ||
490 | // edit out the middle heuristic found frames | ||
491 | info["CallStack"][cur_frame] = tmp_info["CallStack"][cur_frame + heuristic_walk_i - 2]; | ||
492 | } | ||
493 | } | ||
494 | else | ||
495 | { | ||
496 | info = tmp_info; | ||
393 | } | 497 | } |
498 | */ | ||
499 | info = tmp_info; | ||
500 | info["HeuristicWalkI"] = heuristic_walk_i; | ||
501 | info["EbpUsed"] = ebp_used; | ||
502 | |||
394 | } //Get_Call_Stack | 503 | } //Get_Call_Stack |
395 | 504 | ||
396 | //*********************************** | 505 | //*********************************** |
@@ -429,7 +538,7 @@ LLSD WINAPI Get_Exception_Info(PEXCEPTION_POINTERS pException) | |||
429 | FILETIME Last_Write_Time; | 538 | FILETIME Last_Write_Time; |
430 | FILETIME Local_File_Time; | 539 | FILETIME Local_File_Time; |
431 | SYSTEMTIME T; | 540 | SYSTEMTIME T; |
432 | 541 | ||
433 | Str = new WCHAR[DUMP_SIZE_MAX]; | 542 | Str = new WCHAR[DUMP_SIZE_MAX]; |
434 | Str_Len = 0; | 543 | Str_Len = 0; |
435 | if (!Str) | 544 | if (!Str) |
@@ -439,6 +548,7 @@ LLSD WINAPI Get_Exception_Info(PEXCEPTION_POINTERS pException) | |||
439 | 548 | ||
440 | GetModuleFileName(NULL, Str, MAX_PATH); | 549 | GetModuleFileName(NULL, Str, MAX_PATH); |
441 | info["Process"] = ll_convert_wide_to_string(Str); | 550 | info["Process"] = ll_convert_wide_to_string(Str); |
551 | info["ThreadID"] = (S32)GetCurrentThreadId(); | ||
442 | 552 | ||
443 | // If exception occurred. | 553 | // If exception occurred. |
444 | if (pException) | 554 | if (pException) |
@@ -506,7 +616,7 @@ LLSD WINAPI Get_Exception_Info(PEXCEPTION_POINTERS pException) | |||
506 | } //if (pException) | 616 | } //if (pException) |
507 | 617 | ||
508 | // Save call stack info. | 618 | // Save call stack info. |
509 | Get_Call_Stack(pException, info); | 619 | Get_Call_Stack(pException->ExceptionRecord, pException->ContextRecord, info); |
510 | 620 | ||
511 | return info; | 621 | return info; |
512 | } //Get_Exception_Info | 622 | } //Get_Exception_Info |
@@ -552,6 +662,58 @@ void LLMemoryReserve::release() | |||
552 | 662 | ||
553 | static LLMemoryReserve gEmergencyMemoryReserve; | 663 | static LLMemoryReserve gEmergencyMemoryReserve; |
554 | 664 | ||
665 | #ifndef _M_IX86 | ||
666 | #error "The following code only works for x86!" | ||
667 | #endif | ||
668 | LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter( | ||
669 | LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) | ||
670 | { | ||
671 | if(lpTopLevelExceptionFilter == gFilterFunc) | ||
672 | return gFilterFunc; | ||
673 | |||
674 | llinfos << "Someone tried to set the exception filter. Listing call stack modules" << llendl; | ||
675 | LLSD cs_info; | ||
676 | Get_Call_Stack(NULL, NULL, cs_info); | ||
677 | |||
678 | if(cs_info.has("CallStack") && cs_info["CallStack"].isArray()) | ||
679 | { | ||
680 | LLSD cs = cs_info["CallStack"]; | ||
681 | for(LLSD::array_iterator i = cs.beginArray(); | ||
682 | i != cs.endArray(); | ||
683 | ++i) | ||
684 | { | ||
685 | llinfos << "Module: " << (*i)["ModuleName"] << llendl; | ||
686 | } | ||
687 | } | ||
688 | |||
689 | return gFilterFunc; | ||
690 | } | ||
691 | |||
692 | BOOL PreventSetUnhandledExceptionFilter() | ||
693 | { | ||
694 | HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll")); | ||
695 | if (hKernel32 == NULL) | ||
696 | return FALSE; | ||
697 | |||
698 | void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter"); | ||
699 | if(pOrgEntry == NULL) | ||
700 | return FALSE; | ||
701 | |||
702 | unsigned char newJump[ 100 ]; | ||
703 | DWORD dwOrgEntryAddr = (DWORD)pOrgEntry; | ||
704 | dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far | ||
705 | void *pNewFunc = &MyDummySetUnhandledExceptionFilter; | ||
706 | DWORD dwNewEntryAddr = (DWORD) pNewFunc; | ||
707 | DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr; | ||
708 | |||
709 | newJump[ 0 ] = 0xE9; // JMP absolute | ||
710 | memcpy(&newJump[ 1 ], &dwRelativeAddr, sizeof(pNewFunc)); | ||
711 | SIZE_T bytesWritten; | ||
712 | BOOL bRet = WriteProcessMemory(GetCurrentProcess(), | ||
713 | pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten); | ||
714 | return bRet; | ||
715 | } | ||
716 | |||
555 | // static | 717 | // static |
556 | void LLWinDebug::initExceptionHandler(LPTOP_LEVEL_EXCEPTION_FILTER filter_func) | 718 | void LLWinDebug::initExceptionHandler(LPTOP_LEVEL_EXCEPTION_FILTER filter_func) |
557 | { | 719 | { |
@@ -602,6 +764,9 @@ void LLWinDebug::initExceptionHandler(LPTOP_LEVEL_EXCEPTION_FILTER filter_func) | |||
602 | LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; | 764 | LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; |
603 | prev_filter = SetUnhandledExceptionFilter(filter_func); | 765 | prev_filter = SetUnhandledExceptionFilter(filter_func); |
604 | 766 | ||
767 | // *REMOVE:Mani | ||
768 | //PreventSetUnhandledExceptionFilter(); | ||
769 | |||
605 | if(prev_filter != gFilterFunc) | 770 | if(prev_filter != gFilterFunc) |
606 | { | 771 | { |
607 | LL_WARNS("AppInit") | 772 | LL_WARNS("AppInit") |
@@ -737,3 +902,10 @@ void LLWinDebug::generateCrashStacks(struct _EXCEPTION_POINTERS *exception_infop | |||
737 | LLSDSerialize::toPrettyXML(info, out_file); | 902 | LLSDSerialize::toPrettyXML(info, out_file); |
738 | out_file.close(); | 903 | out_file.close(); |
739 | } | 904 | } |
905 | |||
906 | void LLWinDebug::clearCrashStacks() | ||
907 | { | ||
908 | LLSD info; | ||
909 | std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLifeException.log"); | ||
910 | LLFile::remove(dump_path); | ||
911 | } | ||