gpt4 book ai didi

delphi - 无效的指针操作,调试时请求建议

转载 作者:行者123 更新时间:2023-12-03 18:17:27 25 4
gpt4 key购买 nike

我似乎创建了破坏内存的代码。

以前从来没有遇到过这样的问题,我现在正在解决一个无效的指针操作。

在调用 PromptForXYZPropertiesSettings 后,const 字符串 sFilename 的值被丢弃。

// Allow the user to quickly display the properties of XYZ without needing to display the full Editor
function PromptForXYZProperties(const sFilename:string; var AXYZProperties: TXYZProperties): boolean;
var
PropEditor: TdlgEditor;
begin
PropEditor:= TdlgEditor.create(nil);
try
PropEditor.LoadFromFile(sFilename); <-- sFilename = 'C:\My Folder\Some Folder.txt'
PropEditor.SelectedXYZProperties := AXYZProperties;

// Bypass PropEditor to show form owned by it
Result := PropEditor.PromptForXYZPropertiesSettings;

if Result then
begin
PropEditor.SaveToFile(sFilename); <-- sFilename now somethign like 'B'#1#0#0'ë' or value of a different var
end;
finally
PropEditor.free;
end;
end;

其他细节:

  • Delphi 2007、Windows 7 64 位,但在 XP 上测试 EXE 时可以重现
  • 从展览中移除 CONST 停止问题(但大概是因此问题只是潜伏)
  • PropEditor.PromptForXYZPropertiesSettings创建并显示一个表单。如果我禁用 ShowModal 调用然后内存没有被破坏。即使我已删除所有控件和代码从表格

所以我想要一些关于如何调试问题的建议。我在想也许可以观察 sFilename var 所在的内存指针,看看它在哪里被丢弃,但不确定我会怎么做(显然需要在应用程序内完成,所以拥有内存)。

谢谢

最佳答案

在我看来好像有什么东西在破坏你的堆栈。随意查看您的代码,我看不出任何明显的正确性问题。您的想法是正确的:要跟踪此问题,您需要监视字符串的值并查看它何时更改。以下是您的操作方法:

  • 在您的方法的第一行放置一个断点。
  • 当它中断时,查看调试器中的局部变量 View 。找到 sFilename 并双击它。
  • 调试检查器窗口将打开。在顶部它会这样写:sFileame: string $18FEA8 : $4A0E5C。这两个十六进制值分别是对字符串和字符串数据本身的引用位置。
  • 按 CTRL-ALT-B 调出断点列表。它有一个小工具栏,工具栏上的第一个按钮有一个下拉箭头。
  • 单击此箭头并从列表中选择数据断点。您需要创建两个断点,一个用于 Debug Inspector 窗口中的两个值中的每一个。 (如果它警告您要在堆栈上放置数据断点,无论如何都要这样做,但您要记得事后清除它。)
  • 设置两个数据断点值后,按 F9。系统将监视这些内存位置并在它们被修改时中断。从那里您应该能够追踪到破坏字符串的原因。

关于delphi - 无效的指针操作,调试时请求建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2946328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com