在大型项目中使用哪个更好,为什么更好:
#if DEBUG
public void SetPrivateValue(int value)
{ ... }
#endif
Run Code Online (Sandbox Code Playgroud)
要么
[System.Diagnostics.Conditional("DEBUG")]
public void SetPrivateValue(int value)
{ ... }
Run Code Online (Sandbox Code Playgroud) 为什么Visual Studio 2005 .pdb在发布时编译时会生成文件?我不会调试发布版本,为什么它们会生成?
我现在正在研究一个ColdFusion项目,至少Visual Studio开始对我来说很奇怪.
我观察到,当我开始调试时,它构建了项目,它开始部署,部署完成,它开始为我的项目加载符号.
但它很慢,我不知道为什么它开始这一步.我可以做些什么?
这个符号加载步骤是否必要?我该如何禁用它?
在工具 - >选项 - >调试 - >符号对话框中,没有添加符号文件(.pdb)位置.我在下面的字段中指出了我项目的调试目录,并选中了"仅当符号为......时才搜索上面的目录"复选框.如何设置此对话框以关闭符号加载?
我查看了模块窗口中加载了哪些符号,但它对我没有任何说明.问题是什么?

我在iOS 5模拟器/设备中调试Xcode 4.2时遇到问题.正如预期的那样,以下代码崩溃:
NSArray *arr=[NSArray array];
[arr objectAtIndex:100];
Run Code Online (Sandbox Code Playgroud)
在iOS 4中,我获得了十六进制数的有用堆栈跟踪.但是在iOS 5中,它只是给了我:
*** First throw call stack:
(0x16b4052 0x1845d0a 0x16a0674 0x294c 0x6f89d6 0x6f98a6 0x708743 0x7091f8 0x7fcaa9 0x2257fa9 0x16881c5 0x15ed022 0x15eb90a 0x15eadb4 0x15eaccb 0x6f02a7 0x6faa93 0x2889 0x2805)
Run Code Online (Sandbox Code Playgroud)
谢谢.
在Visual Studio 2010 for C#项目中,如果转到项目属性>构建>高级>调试信息,则有三个选项:none,full或pdb-only.根据这个问题的答案,我相信我理解full和pdb之间的一些区别.但是,哪个更适合发布版本?如果我使用"完整"会有性能影响吗?如果我使用"pdb-only",那么调试生产问题会更难吗?
"full"和"pdbonly"有什么区别?https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/debug-compiler-option
我的目标是:
第一个很好,这是这个问题的第二个问题.在高级别,如何在Delphi中给出堆栈条目枚举局部变量?
在较低的水平,这是我一直在调查:
RTTI:没有列出有关方法的这类信息.这不是我实际上认为是一个现实的选择,但无论如何列在这里.
调试信息:加载为调试版本生成的调试信息.
我遇到的问题是:
如果这是正确的方法,那么这个问题变成'是否有TDS/TD32文件格式的文档,是否有任何加载局部变量的代码示例?'
代码示例不是必需的,但可能非常有用,即使它非常小.
我在x86 Linux上有一些编译库,我想快速确定它们是否使用调试符号进行编译.
我有一个记录异常条带跟踪的应用程序,我希望这些堆栈跟踪在生产中部署时包含文件名和行号.我想出了如何使用程序集部署调试符号,但在研究问题的过程中我遇到了这个问题,这意味着在生产环境中包含pdb文件并不是一个好主意.对接受的答案的评论说:"......调试信息可以泄露敏感数据并成为攻击媒介.取决于你的应用程序是什么."
那么可能会暴露哪种敏感数据呢?如何使用调试符号来破坏应用程序?我对技术细节很好奇,但我真正想要的是一种评估任何给定应用程序和生产环境中包含调试符号的风险的实用方法.换句话说:可能发生的最坏情况是什么?
编辑:后续问题/澄清
因此,基于目前为止每个人的答案,似乎这个问题可以简化为.NET应用程序.这篇来自John Robbins的博客链接在迈克尔·马多克斯的答案中,有点向我跳了出来:
.NET PDB仅包含两条信息,源文件名及其行和本地变量名.所有其他信息都已包含在.NET元数据中,因此无需在PDB文件中复制相同的信息.
对我来说,这重申了其他人对Reflector所说的话,其含义是真正的问题是访问程序集.一旦确定了,关于PDB的唯一决定是你是否关心暴露文件名,行号和本地变量名(假设你没有向最终用户展示堆栈跟踪).或者我过度简化了这个?
我的系统上安装了二进制文件,并希望查看给定函数的反汇编.优选使用objdump,但其他解决方案也是可以接受的.
从这些问题我已经了解到,如果我只知道边界地址,我可能能够反汇编部分代码.从这个答案我已经学会了如何将我的拆分调试符号转换回单个文件.
但即使在单个文件上运行,甚至反汇编所有代码(即没有启动或停止地址,但只是简单的-d参数objdump),我仍然没有在任何地方看到该符号.这是有道理的,因为有问题的函数是静态的,所以它不会被导出.然而,valgrind将报告函数名称,因此它必须存储在某处.
查看调试部分的详细信息,我找到了本.debug_str节中提到的名称,但我不知道可以将其转换为地址范围的工具.
我将Visual Studio 2005设置为使用Microsoft的符号服务器.我还安装了UltraMon,它为每个进程注入一个钩子DLL.每当我开始调试我的MFC应用程序时,Visual Studio会说:
"Loading symbols for C:\Program Files\UltraMon\RTSUltraMonHookX32.dll..."
Run Code Online (Sandbox Code Playgroud)
从眨眼间到几十秒钟.它永远不会找到那些符号......我可以告诉它不要去寻找它吗?
(我尝试创建一个空RTSUltraMonHookX32.pdb文件,但Visual Studio发现它不好并继续查找.)
debug-symbols ×10
debugging ×6
.net ×2
c# ×2
build ×1
c ×1
delphi ×1
disassembly ×1
dwarf ×1
elf ×1
gdb ×1
ios ×1
objdump ×1
pdb-files ×1
preprocessor ×1
production ×1
security ×1
stack ×1
xcode ×1