2009-10-16 3 views
0

전체 디버거 일 필요는 없지만 어설 션이 발생할 때 좋은 스택 추적 덤프를 가져와야합니다. 호출 된 함수의 간단한 목록으로는 충분하지 않습니다. 나는 내가 모든 스택 변수와 현재 (이) 개체의 덤프를 얻을 것을 의미C++ 용 내장 디버거

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 
====================================== 

처럼 내게 뭔가를주고 내 에펠 시스템과 매우 행복 해요. 그리고 가장 좋은 점은 클라이언트 측에서 제로 구성이 필요하기 때문에 고객에게 제공 할 수 있다는 것입니다.

누구나 내가 C++/C 또는 D 또는 CObject (어쨌든 langauge를 전환해야하며 이것이 네 개의 선호하는 대상 임)에서이 작업을 수행 할 수있는 방법을 알고 있습니까?

그리고 GDB를 배포해야한다고 말하는 사람들은 모두 downvotes를 얻을 것입니다.

창문
+0

휴대용 코드로이 작업을 수행 할 수 있을지 의심 스럽기 때문에 어떤 OS를 필요로합니까? –

+0

로컬과 함수 인수 ('this'포함)에 대한 정보는 스택 위치와 레지스터를 적극적으로 재사용 및 폐기하기 때문에 최적화 된 코드에서 생성 된 호출 스택에서 매우 신뢰할 수 없다는 것을 알고 있습니까? 비록 당신이 설명하는 것을 수행한다해도 대부분의 경우 최상위 프레임의 소수를 제외한 모든 변수는 값이 잘못보고됩니다 ... –

+0

예 저는 베타 버전과 처음 배포 된 버전에서 -O0으로 응용 프로그램을 제공 할 것입니다. 그리고 OS의 경우 큰 세 가지가 대상입니다 : MacOSX, Linux, Windows. 모든 플랫폼에서 동일한 솔루션 일 필요는 없습니다. – Lothar

답변

1

, 미니 덤프 봐, toolhelp.dll

0

의 방법과 작성 가능한 스테인 Windows에서 미니 덤프는 충분하다, 지적. 그렇다면 의심의 여지없이 거의 모든 대안보다 훨씬 쉬울 것입니다.

미니 덤프는 에펠에서 얻은 것과 거의 비슷하지 않습니다. 더 가까운 것을 필요로한다면 아마도 코드의 대부분을 직접 작성해야 할 것입니다. Antex Stack Walker은 아마도 합리적인 시작일 것입니다 (stackwalker.cpp와 stackwalker.h를 찾으십시오).

0

당신은 구글-breakpad보고 할 수 있습니다 : 그 내가 인정하지

: http://code.google.com/p/google-breakpad/

그것은 이전에 에어백으로 알려진 프로젝트의 그것을 사용하지 않았습니다. (이와 같은 것에 대한 나의 필요는 Windows 전용입니다.)하지만 모질라를 사용하고있는 것 같습니다. 꽤 활동적인 ms.

사후 부검을 할 수 있도록 서버에 크래시 덤프를 자동으로 보내기위한 라이브러리 및 도구 모음입니다. Firefox가 현재 그것을 사용하고 있으므로 이해하기 쉽습니다. 그래서 꽤 크로스 플랫폼이라고 상상해보십시오. 단점은 클라이언트 프로그램에 자체적으로 포함되어 있지 않다는 것입니다. 유용하기 위해서는 인프라가 필요합니다. 그것은 당신의 상황에 대해 실행 가능할 수도 있고 그렇지 않을 수도 있습니다.

보고서를 가져 오는 서비스를 원하지 않는다면 (클라이언트에서 보내고 싶거나 이메일로 보냈을 수도 있습니다) 클라이언트 리포터가 정보를 '서버'로 보낼 수 있다고 상상해보십시오. '프로그램을 사용하여보고를 수행합니다. 그렇게 작동하도록하려면 얼마나 많은 노력이 필요할지 모르겠다.

1

리눅스에서 glibc를 사용하는 경우 'backtrace()'기능을 살펴보십시오. 중요한 오류가 발생할 때마다 스택 트레이스를 가져 오기 위해 PPC 시스템에서 사용했습니다.

내 구현에서는 리턴 호스트를 기록하고 (addr2line을 기반으로하는) 호스트 플랫폼의 스크립트를 사용하여 파일 이름/기능 이름/행 번호로 다시 변환합니다.