From 9e31de9d1ce866261aa71ac1b185853f8b0b085e Mon Sep 17 00:00:00 2001 From: Nicolas van Kempen Date: Tue, 19 Mar 2024 21:06:22 +0000 Subject: [PATCH 1/4] Add input file name, command line --- src/chatdbg/chatdbg_lldb.py | 38 +++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/chatdbg/chatdbg_lldb.py b/src/chatdbg/chatdbg_lldb.py index 368dc81..eb0bfce 100644 --- a/src/chatdbg/chatdbg_lldb.py +++ b/src/chatdbg/chatdbg_lldb.py @@ -778,10 +778,40 @@ def chat( if len(source_code_entries) == max_initial_locations_to_send: break - parts.append( - f"Here is the source code for the first {len(source_code_entries)} frames:\n\n" - + "\n\n".join(source_code_entries) - ) + if source_code_entries: + parts.append( + f"Here is the source code for the first {len(source_code_entries)} frames:\n\n" + + "\n\n".join(source_code_entries) + ) + else: + result.AppendWarning("could not retrieve source code for any frames.") + + command_line_invocation = get_command_line_invocation(debugger) + if command_line_invocation: + parts.append( + "Here is the command line invocation that started the program:\n```\n" + + command_line_invocation + + "\n```" + ) + else: + result.AppendWarning("could not retrieve the command line invocation.") + + input_path = get_input_path(debugger) + if input_path: + try: + with open(input_path, "r", errors="ignore") as file: + input_contents = file.read() + if len(input_contents) > 512: + input_contents = input_contents[:512] + "\n\n[...]" + parts.append( + "Here is the input data that was used:\n```\n" + + input_contents + + "\n```" + ) + except Exception as e: + result.AppendWarning( + "could not retrieve the input file contents. " + str(e) + ) parts.append(" ".join(remaining) if remaining else "What's the problem?") From 8b3c3a12a2966c453585c9785fe5b3279f7b2577 Mon Sep 17 00:00:00 2001 From: Nicolas van Kempen Date: Tue, 19 Mar 2024 21:09:29 +0000 Subject: [PATCH 2/4] len(thread) is cached anyway --- src/chatdbg/chatdbg_lldb.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/chatdbg/chatdbg_lldb.py b/src/chatdbg/chatdbg_lldb.py index eb0bfce..80f3db5 100644 --- a/src/chatdbg/chatdbg_lldb.py +++ b/src/chatdbg/chatdbg_lldb.py @@ -611,7 +611,6 @@ def get_frame_summaries( if not thread: return None - total_frames = len(thread) # This can be a long operation e.g. stack overflow. skipped = 0 summaries: List[Union[_FrameSummaryEntry, _SkippedFramesEntry]] = [] @@ -665,22 +664,19 @@ def get_frame_summaries( [1 if isinstance(s, _FrameSummaryEntry) else s.count() for s in summaries] ) - if total_summary_count < total_frames: + if total_summary_count < len(thread): if isinstance(summaries[-1], _SkippedFramesEntry): summaries[-1] = _SkippedFramesEntry( - total_frames - total_summary_count + summaries[-1].count() + len(thread) - total_summary_count + summaries[-1].count() ) else: - summaries.append( - _SkippedFramesEntry(total_frames - total_summary_count + 1) - ) + summaries.append(_SkippedFramesEntry(len(thread) - total_summary_count + 1)) if len(summaries) > max_entries: summaries.pop(-2) - assert ( - sum([1 if isinstance(s, _FrameSummaryEntry) else s.count() for s in summaries]) - == total_frames - ) + assert sum( + [1 if isinstance(s, _FrameSummaryEntry) else s.count() for s in summaries] + ) == len(thread) return summaries From 90f6fb7d3d11782ac1b3a44e32e0cd7c8e03756a Mon Sep 17 00:00:00 2001 From: Nicolas van Kempen Date: Wed, 20 Mar 2024 01:26:07 +0000 Subject: [PATCH 3/4] Add stack overflow prompt --- src/chatdbg/chatdbg_lldb.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/chatdbg/chatdbg_lldb.py b/src/chatdbg/chatdbg_lldb.py index 80f3db5..5577595 100644 --- a/src/chatdbg/chatdbg_lldb.py +++ b/src/chatdbg/chatdbg_lldb.py @@ -661,7 +661,7 @@ def get_frame_summaries( summaries.pop(-2) total_summary_count = sum( - [1 if isinstance(s, _FrameSummaryEntry) else s.count() for s in summaries] + [s.count() if isinstance(s, _SkippedFramesEntry) else 1 for s in summaries] ) if total_summary_count < len(thread): @@ -675,7 +675,7 @@ def get_frame_summaries( summaries.pop(-2) assert sum( - [1 if isinstance(s, _FrameSummaryEntry) else s.count() for s in summaries] + [s.count() if isinstance(s, _SkippedFramesEntry) else 1 for s in summaries] ) == len(thread) return summaries @@ -751,7 +751,7 @@ def chat( summaries = get_frame_summaries(debugger) if not summaries: - result.AppendWarning("could not generate a frame summary.") + result.AppendWarning("could not generate any frame summary.") else: frame_summary = "\n".join([str(s) for s in summaries]) parts.append( @@ -760,6 +760,18 @@ def chat( + "\n```" ) + total_frames = sum( + [ + s.count() if isinstance(s, _SkippedFramesEntry) else 1 + for s in summaries + ] + ) + + if total_frames > 1000: + parts.append( + "Note that there are over 1000 frames in the stack trace, hinting at a possible stack overflow error." + ) + max_initial_locations_to_send = 3 source_code_entries = [] for summary in summaries: From beb1c8269033aca0cdc2bbc47360ea81e482c11b Mon Sep 17 00:00:00 2001 From: Nicolas van Kempen Date: Wed, 20 Mar 2024 01:27:53 +0000 Subject: [PATCH 4/4] Suggest code --- src/chatdbg/chatdbg_lldb.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/chatdbg/chatdbg_lldb.py b/src/chatdbg/chatdbg_lldb.py index 5577595..df8418d 100644 --- a/src/chatdbg/chatdbg_lldb.py +++ b/src/chatdbg/chatdbg_lldb.py @@ -821,7 +821,11 @@ def chat( "could not retrieve the input file contents. " + str(e) ) - parts.append(" ".join(remaining) if remaining else "What's the problem?") + parts.append( + " ".join(remaining) + if remaining + else "What's the problem? Provide code to fix the issue." + ) prompt = "\n\n".join(parts)