|  |  |  |  |  |  | 
					            
						            
							            
								            |  | 
	WinDbg帖子发起人: Dic4000   发起时间: 2015-10-13 21:58 下午   回复: 7
 
	 
		
			| 
					
						|         | 
						      
						        | 帖子排序: |  |  |  |  
				
					| 
							
								| 
										
											|  2015-10-13, 21:58 下午 |  
											| 
													 Dic4000 
 
   注册: 2015-10-13
 发 贴: 7
 | 
													
														| 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系? 
 附件: 1.PNG
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 我是一个WinDbg初学者,刚刚来到这里的论坛,目前我在学习调试一个简单的C程序时遇到了一个问题,搜索了很长时间,也没找到一个明确的答案,希望大家能给我点提示。 程序如下: #include<stdio.h> int main(void) { 	int a = 1235; 
 	const char *str = "abcdef"; 	printf("a=%d,str=%s\n", a, str); 	int b = 9; 	int sum = SumX(a, b, 3, 1); 	printf("sum=%d", sum); 	return 0; } 
 int SumX(int a, int b, int d, int e) { 	int c = a + b; 	return c; }
 
 在汇编模式下跟踪到 const char *str = "abcdef"; 这一语句时,显示的汇编语句是: mov    dword ptr[ebp - 8], offset main!_NULL_IMPORT_DESCRIPTOR <PERF>(main + 0x22000) (011d2000) 
 我对于这里的 offset main!_NULL_IMPORT_DESCRIPTOR 命令不是很明白,我用命令 da main + 0x22000 查看内存,显示的如同预期一样是“abcdef”,但是用命令 da main!_NULL_IMPORT_DESCRIPTOR 却显示的是“” (空字符串),用x main!_NULL_IMPORT_DESCRIPTOR 查看地址是0x011d1268,  这个地址0x011d1268与(main + 0x22000 = 0x011d2000) 并不一致。 
 后来我发现<PERF>是 performance - optimized code的含义,但我编译此程序是用命令行并没有打开任何优化开关编译程序用的是Visual Studio 2013 x86 命令行工具 我想知道对于“const char *str = "abcdef" 语句 为何会反汇编出offset main!_NULL_IMPORT_DESCRIPTOR 这样的语句,却找不到相应地址中的内容,这个和const变量有什么关系吗? 能为我讲讲原因吗?不甚感激~~~
   
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2015-10-15, 00:22 上午 |  
											| 
													 Dic4000 
 
   注册: 2015-10-13
 发 贴: 7
 | 
													
														| Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 很感谢你的回复,让我知道我弄错的概念了(汇编也刚刚开始学,很多概念也没理解到位~~~)。 我把main!_NULL_IMPORT_DESCRIPTOR 这个Symbol的地址的值(0x011d126)当成了Offset(偏移量),我一直以为 地址的偏移量是基于0开始的,所以地址就相当于偏移量了。 
  我现在还有2个问题想请教下: 1: offset  main!_NULL_IMPORT_DESCRIPTOR 这个语句所取到的偏移量不是基于0计算得到的,那么它是基于哪个位置(段)的呢? 2:Windbg中有没有什么命令或方式可以得到类似于 offset  main!_NULL_IMPORT_DESCRIPTOR 的结果?这个我搜索了好久都没找到。 3:我知道可以使用dumpbin工具可以查看程序中有哪些段以及这些段的范围,在WinDBG中有类似的命令吗?如何知道哪个地址属于哪个段?
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2015-10-16, 10:55 上午 |  
											| 
													 悬崖遛马 
 
   注册: 2012-07-24
 发 贴: 30
 | 
													
														| Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 从生成的汇编代码来看,你的代码应该还是启用了优化的,建议到设置里面disable掉所有优化选项。或者用debug模式调试 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2015-10-16, 14:12 下午 |  
											| 
													 格蠹老雷 
 
   注册: 2005-12-19
 发 贴: 1,303
 | 
													
														| Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 1,运行期是就是线性地址空间的偏移地址,等价于线性地址2,直接用x main!_NULL_IMPORT_DESCRIPTOR 3,找到模块起始地址,然后!dh <模块起始地址> 
 
 
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2015-10-16, 21:30 下午 |  
											| 
													 Dic4000 
 
   注册: 2015-10-13
 发 贴: 7
 | 
													
														| Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系? 
 附件: 2.png
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 谢谢楼上的回复,但第二个回答我还是没有弄懂。你是说“x main!_NULL_IMPORT_DESCRIPTOR”命令运行后的结果就是汇编语句“offset  main!_NULL_IMPORT_DESCRIPTOR”的结果吗? 可这样对不上啊,你看我新的截图: 
 
 main模块的地址范围:                                00cd0000H ~ 00cf7000H x main!main                                                00cd1000H x main!_NULL_IMPORT_DESCRIPTOR           00cf1288H 字符串"abcdef"                                              00cf2000H 
 这个00cf2000H才是字符串"abcdef"最终在内存中的地址,也是模块的起始地址(00cd0000H)加上00cf2000H的偏移的结果,可那个x main!_NULL_IMPORT_DESCRIPTOR的结果是怎样变成00cf2000H的呢? 
 |  Levwz wrote: |  | | 从生成的汇编代码来看,你的代码应该还是启用了优化的,建议到设置里面disable掉所有优化选项。或者用debug模式调试 | 
 | 
我编译的时候 用-od 关掉了优化, 下面是我的cl编译选项: - c - X - I"E:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\include" - TC main.c - Gd - Od - FAcs - Fa"Manual\\" - Fd"Manual\\" - Fo"Manual\\mainObj.obj" - Zi - Zl - Za 
 
 
 
   
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2015-10-17, 17:51 下午 |  
											| 
													 Dic4000 
 
   注册: 2015-10-13
 发 贴: 7
 | 
													
														| Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系? 
 |  
														|  |  |  
											| 
													
														|   |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
		
			| 高端调试 » 软件调试 » WinDbg » Re: 请教const变量是否和_NULL_IMPORT_DESCRIPTOR有关系? |  |  
		
		
		 |  |  |  |