用于C ++的可嵌入调试器

时间:2009-10-16 15:56:43

标签: c++ c debugging

不需要是一个完整的调试器,但我需要在引发assert时获得良好的堆栈跟踪转储。一个简单的被调用函数列表是不够的。我对我的埃菲尔系统非常满意,它给了我类似的东西

17 frames in current stack.
=====  Displaying only top 10 frames in run-time stack  =====
agent call wrapper 2
======================================
lookup_key USER_COMMAND_INVOCATION
Current = USER_COMMAND_INVOCATION#03FE5D00
        [ arachno_window = #061A4AF0
          window = #061A4AF0
          mrec = Void
          trigger = "if"
          param_int = 0
          param_str = Void
          skip_next_keystroke = false
          in_continuation_key = false
          current_hook = #05EFB500
          update_default_command = #05EF3578
          default_command = "Editor.Modifications#cInsert Typed Text"
          last_invoked_command = "Editor.Modifications#cTab Character"
          show_popup_menu_action = #061B3C30
          build_menu = Void
          menu_line = 0
          menu_offset = 0
          modifiers = #03FDCAC8
          code = #03FDCB88
          character = #03FDCB58
          count = 0
          prefix_count = -1
          selected_commands = #03FDCA98
          cached_file_types = #03FDCA68
          cached_file_context = #03FDCA38
          cached_window_type_name = Void
          project_context_action = #061B3C80
          program_context_action = #061B3C58
          window_context_action = #061B3CA8
          cached_window_name_valid = false
          cached_file_type_valid = false
          cached_file_context_valid = false
          reset_prefix_on_next_event = false
        ]
before = true
mod = BIT_32
        [ bits = 0
        ]
c = 65362
str = ""
menu = Void
map = Void
key = Void
b = Void
i = 0
n = 0
m = 0
cval = 65362
char = 0
cnt = 0
s = Void
skip_flag = false
prefix_found_flag = false
ev = AGUI_EVENT_CONSTANTS
t = Void
consume = false
line 387 column 13 file x:\work_arachno\src\run\user_command_invocation.e
======================================
on_key_hook (late bind.)
======================================
on_key_hook EDITOR_KEY_STEALER_HOOK
Current = EDITOR_KEY_STEALER_HOOK#05EFB500
        [ callback = POINTER#063D1570
          sapi = SCRIPTING_API
        ]
mod = BIT_32
        [ bits = 0
        ]
code = 65362
str = ""
Result = false
break = false
engine = POINTER#04BEE690
cmd_pair = Void
line 41 column 0 file x:\work_arachno\src\editor\editor_key_stealer_hook.e
======================================
callback SCRIPTING_API
ptr = POINTER#04BEE690
cb = POINTER#063D1570
args = 3
res = 1
Result = 0
line 481 column 16 file x:\work_arachno\src\scripting\scripting_api.e
======================================
External CECIL call.
======================================
editor__move_lines EDITOR_SCRIPTING
Current = EDITOR_SCRIPTING#05EE17A0
        [ sapi = SCRIPTING_API
          view = #061A47D0
          positions = #05EE1780
          stealer_hook = #05EFB500
          html_file_dialog = Void
          html_file_dialog_modified = false
        ]
manager = EDITOR_MANAGER#05EE0ED8
        [ configuration = #03FD7F00
          breakpoints = #05ED0460
          folding_settings = #05ED76C0
          lang_descriptors = #05EDD360
          confirm_edit_while_debugging = true
          use_word_wrap = false
          are_foldings_visible = true
          are_line_numbers_visible = true
          are_modified_markers_visible = true
          are_bookmarks_visible = true
          are_whitespaces_visible = false
          is_highlight_current_line = false
          is_highlight_search_results = true
          is_right_margin_visible = true
          are_indent_lines_visible = true
          are_line_endings_visible = false
          are_end_of_line_dots_visible = false
          are_breakpoints_visible = false
          commands = #03FD1E70
          completition = #0400A8C0
          tooltip_buffer = Void
          folding_background_task_id = 0
          folding_file_observer = #061C6EE0
          folding_rand = #05EDDE88
          bracket_window = Void
          bracket_window_popdown_task = 0
          tracked_positions = Void
          code_hinting = #05EE2F20
          code_hinting_active = false
          code_hinting_window_id = 0
          code_hinting_file_id = 0
          code_hinting_shutdown_task = 0
          code_hinting_shutdown_agent = #05ED2690
          code_hinting_autostart = true
          code_hinting_info_display = 2
          code_hinting_display_id = 0
          code_hinting_sequence_id = 3
        ]
engine = POINTER#04BEE690
sobj = POINTER#07526740
Result = 0
first = 486
last = 486
ref = 487
before = false
line 220 column 25 file ΘÖ▓♣
======================================
move_lines (late bind.)
======================================
move_lines EDITOR_BUFFER
Current = EDITOR_BUFFER#03FE91B0
        [ modified_lines = #074BD408
          modified_lines_string = ""
          lines = #074BD348
          last_modified_position = #061D6B18
          is_read_only_state = false
          is_modified = true
          is_special_empty = false
          is_zombie = false
          line_end_coding = 1
          loaded_without_last_newline = true
          descriptor = #05EE04C0
          views = #074BD3A8
          transform_position = Void
          transform_array = #07552E40
          forbid_update_counter = 0
          inside_undo_operation = false
          debug_position_list = #074BD390
        ]
pos = EDITOR_POSITION#061B35A0
        [ help = "caret"
          buffer_line = #03FF0460
          offset = 18
          data = #075181E0
          is_anchored = false
          is_transformed = false
          next_transformed = Void
          next = #044C0270
        ]
lower = 486
upper = 486
ref = 487
before = false
count = 1
src = 0
dest = 1
i = 2214
j = 2213
low = 486
up = 489
target = 486
skip = false
a = ARRAY[EDITOR_BUFFER_LINE]#075529C0
        [ storage = NATIVE_ARRAY[EDITOR_BUFFER_LINE]#03FDA448
          capacity = 1
          upper = 1
          lower = 1
        ]
set = SET[INTEGER]#075266E0
        [ buckets = NATIVE_ARRAY[SET_NODE[INTEGER]]#0755B000
          cache_user = -1
          cache_node = Void
          cache_buckets = 0
          count = 2213
          capacity = 3079
        ]
line 1107 column 25 file x:\work_arachno\src\editor\editor_buffer.e
======================================

这意味着我获得了所有堆栈变量和当前(this)对象的转储。 最好的是我可以将其发送给客户,因为它需要在客户端进行零配置。

有谁知道我怎样才能在C ++ / C甚至D或CObject中做到这一点(我还是要切换语言,这是我的四个首选目标)?

每个说我应该部署GDB的人都会得到帮助。

4 个答案:

答案 0 :(得分:1)

对于Windows,请查看minidump,使用toolhelp.dll中的方法创建

答案 1 :(得分:1)

如果您使用glibc在Linux上,请查看“backtrace()”函数。 我已经在PPC系统上使用它来在发生严重错误时获得堆栈跟踪。

在我的实现中,我只记录返回地址并使用主机平台上的脚本(基于addr2line)将其转换回文件名/函数名/行号。

答案 2 :(得分:0)

正如stijn指出的那样,在Windows下,一个小型转储可能就足够了。如果是的话,它几乎可以比任何替代方案容易得多。

minidump不会非常接近你从埃菲尔得到的东西。如果你需要更接近的东西,你可能必须自己编写(大部分)代码。 Antex Stack Walker可能是一个合理的开始(查找stackwalker.cpp和stackwalker.h)。

答案 3 :(得分:0)

您可能需要查看google-breakpad:http://code.google.com/p/google-breakpad/

这个项目以前称为安全气囊:

我会承认我没有使用过它(我对这类产品的需求仅限于Windows),但它似乎背后有Mozilla,而且看起来非常活跃。

这是一组自动将故障转储发送到服务器的库和工具,因此您可以进行验尸。据我所知,Firefox目前正在使用它,所以我认为它是非常跨平台的。缺点是它在客户端程序中不是自包含的 - 您需要一些基础设施才能使其有用。这可能适用于您的情况,也可能不适用。

虽然如果您不想获得获取报告的服务(可能您只是想在客户端上使用它们或通过电子邮件发送它们),我想您可以让客户端记者将其信息发送到“服务器”客户端计算机上也存在用于执行报告的程序。不知道让它像这样起作用会有多少工作。