无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: 2011yaya2007777
打印 上一主题 下一主题

支持含有碎片的文件仿真

    [复制链接]
691#
发表于 2015-1-9 15:47:19 | 只看该作者
本帖最后由 mdyblog 于 2015-1-9 16:33 编辑
527104427 发表于 2015-1-9 15:18
新版的grldr,似乎每个标签都要加 debug 3,才看得到过程


用winHEX 小心的在 :find_oem
函数中加一行打印语句。


:find_oem
echo  ==:find_oem   

:find_oem
的确在循环执行

又回到 printf时代。
回复

使用道具 举报

692#
发表于 2015-1-9 16:43:51 | 只看该作者
这个debug 3的问题我下次修改一下,只要批处理进程没有退出就一直存在.

点评

发现死循环为下面红色代码: 上面替换了一行。 有加了5行,死循环检测。 这样,程序也能成功运行,提示成功,中间打印出3行,(前面2行就是前面的画面)。 但是 PE启动是蓝屏。 估计生成OEM时不正确。OEM  详情 回复 发表于 2015-1-9 18:07
狂按回车 发现死循环为下面红色代码: call :aline %1 %scsi% %aline% %1为【(1)/TEXTSETUP.OEM】 %scsi%为【roller"】 %aline%为【C】 %p%为【0x40000】 %loop%为【0】 注意%scsi% 的值有一个双引  详情 回复 发表于 2015-1-9 17:33
回复

使用道具 举报

693#
发表于 2015-1-9 17:33:39 | 只看该作者
chenall 发表于 2015-1-9 16:43
这个debug 3的问题我下次修改一下,只要批处理进程没有退出就一直存在.

狂按回车
发现死循环为下面红色代码:

::动态生成txtsetup.oem文件实现免按F6键
:dyn_oem
call Fn.13 %p% "\n" || exit
call Fn.0 0 "%s" %@retval% | set aline =
call :aline %1 %scsi% %aline% && set p=0
goto :dyn_oem
:aline
if not "%~3"=="" set tmp=%~3 || exit

call Fn.11 "%2" "%tmp:~-16%" && echo -e \r\n[Scsi]\r\n%aline% >> %1 && exit
if /i ";[iles.scsi.%2]"=="%tmp%" && set loop=0 && echo [Files.scsi.%2] >> %1 && exit
call Fn.11 ";[" "%tmp:~0,2%" && set loop=1 && exit
call Fn.11 "\[" "%tmp:~0,1%" && set loop=0 && echo %aline% >> %1 && exit
call Fn.11 "\;" "%tmp:~0,1%" || call Fn.11 "#" "%tmp:~0,1%" || calc %loop% > nul || echo %aline%  >> %1 && exit
exit


call :aline %1 %scsi% %aline%
%1为【(1)/TEXTSETUP.OEM】
%scsi%为【roller"】
%aline%为【C】
%p%为【0x40000】
%loop%为【0】

注意%scsi% 的值有一个双引号, 再作为函数参数。 可能引起参数切割的问题

if not "%~3"=="" set tmp=%~3
这行, 显示为:
S1:[if not ""=="" set tmp=%~3 ]
也就是%3而为空。
看代码逻辑,似乎应该为【%aline%】即【C】

文件可能是:
1) 前面的Fn.X问题,导致出现引号这种棘手问题
2) 前面使用Fn.X的问题,导致出现引号这种棘手问题
3) 引号导致参数切割出问题



回复

使用道具 举报

694#
发表于 2015-1-9 18:06:56 | 只看该作者
新上传的版本,解决debug 3的问题.

上面的问题可以上F6IMG的作者调试跟踪一下看看,必竟作者本人对这些代码的用途比较熟悉,看看是哪里出了问题.

我需要明天才有时间查看.

点评

grub4dos-0.4.5c-2015-01-10.7z 测试还是一样的。 看不出有什么区别。  详情 回复 发表于 2015-1-10 12:13
run_line 函数优化了下,call :abc 时不占用宝贵的64K的命令行栈。 下面 红色为添加的代码。  详情 回复 发表于 2015-1-10 11:34
看了源代码, 猜测你们的意思。 cmd_buffer += (arg_len + 0x10) & -0x10; 似乎应该为: cmd_buffer += (arg_len + 0x0F) & ~0x0F; 2者的结果是不同。  详情 回复 发表于 2015-1-10 10:55
程序中有 call 循环嵌套。 call 循环嵌套, 不会 导致堆栈溢出吗?  详情 回复 发表于 2015-1-9 19:59
关于DEBUG,请问下面的脚本怎么单步调试中间的一段 以前的版本是可以轻松单步中间的代码. 还是以前一样,可是随时切换——随时开单步,随时关单步。  详情 回复 发表于 2015-1-9 18:39
回复

使用道具 举报

695#
发表于 2015-1-9 18:07:51 | 只看该作者
本帖最后由 mdyblog 于 2015-1-11 10:14 编辑
chenall 发表于 2015-1-9 16:43
这个debug 3的问题我下次修改一下,只要批处理进程没有退出就一直存在.


发现死循环为下面红色代码:

::动态生成txtsetup.oem文件实现免按F6键
:dyn_oem
:dyn_oem
set /a p0=%p%-100
:dyn_oem1
if %p0%==%p% exit 1
set p0=%p%

call Fn.13 %p% "\n" || exit
call Fn.0 0 "%s" %@retval% | set aline =
call :aline %1 %scsi% %aline% && set p=0
goto :dyn_oem1
:aline
if not "%aline%"=="" set tmp=%aline% || exit
call Fn.11 "%2" "%tmp:~-16%" && echo -e \r\n[Scsi]\r\n%aline% >> %1 && exit
if /i ";[iles.scsi.%2]"=="%tmp%" && set loop=0 && echo [Files.scsi.%2] >> %1 && exit
call Fn.11 ";[" "%tmp:~0,2%" && set loop=1 && exit
call Fn.11 "\[" "%tmp:~0,1%" && set loop=0 && echo %aline% >> %1 && exit
call Fn.11 "\;" "%tmp:~0,1%" || call Fn.11 "#" "%tmp:~0,1%" || calc %loop% > nul || echo %aline%  >> %1 && exit
exit

上面替换了2行。
有加了5行,死循环检测。
这样,程序也能成功运行,提示成功,中间打印出3行,(前面2行就是前面的画面)。

但是 PE启动是蓝屏。
估计生成OEM时不正确。OEM文件非法。 导致SATA没有驱动起来。



回复

使用道具 举报

696#
发表于 2015-1-9 18:39:01 | 只看该作者
本帖最后由 mdyblog 于 2015-1-10 10:39 编辑
chenall 发表于 2015-1-9 18:06
新上传的版本,解决debug 3的问题.

上面的问题可以上F6IMG的作者调试跟踪一下看看,必竟作者本人对这些代 ...


关于DEBUG,请问下面的脚本怎么单步调试中间的一段
以前的版本是可以轻松单步中间的代码.

!BAT
set s=A
set /a i=10000
:LOOP1
echo [%s%]-%i%
set /a i=%i%-1
if %i%>=1 goto :LOOP1

#前面循环 "执行30000行---30000个回车?" 代码


#调试中间代码
echo [debug begin]
debug 3
set s=%s%B
echo [%s%]111
echo [%s%]222
echo [%s%]333
echo [%s%]444
call :FUN3

debug 0
echo [debug end]


#后面循环 "执行30000行---30000个回车?" 代码
set /a i=10000
:LOOP2
echo [%s%]-%i%
set /a i=%i%-1
if %i%>=1 goto :LOOP2

goto :eof

:FUN3
debug 3
set s=%s%C
echo [%s%]111
echo [%s%]222
echo [%s%]333
echo [%s%]444

goto :eof

还是以前一样,可是随时切换——随时开单步,随时关单步。

是不是规定下, 单步设置为debug 3,  单步取消为debug  -3。 其它值包括0,都不能取消单步设置.
              或者, 单步设置为debug s,   单步取消为debug  -s。
  


回复

使用道具 举报

697#
发表于 2015-1-9 19:59:37 | 只看该作者
本帖最后由 mdyblog 于 2015-1-9 20:22 编辑
chenall 发表于 2015-1-9 18:06
新上传的版本,解决debug 3的问题.

上面的问题可以上F6IMG的作者调试跟踪一下看看,必竟作者本人对这些代 ...


脚本程序中有  call : 循环嵌套。

call  : 循环嵌套, 不会 导致堆栈溢出吗?
回复

使用道具 举报

698#
发表于 2015-1-9 21:14:20 | 只看该作者
本帖最后由 不点 于 2015-1-9 21:33 编辑

grub4dos 在解决内存冲突方面,作了多次的努力。最早的努力,是 gandalf 发现 grub4dos 总是莫名其妙地死机,然后,我们了解到,那是因为 gnu grub legacy 的保护模式堆栈位于较高内存地址造成的。当某些程序片段使用较多堆栈时,就要发生死机了。对此,我们作了两项改进,其一是把保护模式堆栈撤销,与实模式堆栈合并,只保留一个堆栈;其二是把c语言函数内的数组和局部函数都移出到函数体之外,不再占用堆栈。后来又作了一项改进,那就是,把递归函数修改成非递归的函数,用循环来代替递归,大大减轻了堆栈的负担。所以,后来再也没有出现莫名其妙死机的问题了。

为了解决常规内存太少,没有足够的空间来容纳新的功能代码的问题,从 0.4.5 开始,把保护模式的代码移动到扩展内存中,这样就解决了功能无法扩展的问题了。起初我们使用 16M 内存,后来又增加到 32M。由于有了足够的内存,所以,我们从此可以支持运行用户程序了。

现在的程序代码,也有可能在某些局部范围产生内存冲突。但这都是可以定位的,也是可以解决的。

点评

看了最新的源码。 现在用的是一个64K的全局数组——构成一个栈cmd_buffer,来保存cmdline_buf。 这样 89次死机,差不多对上来。  详情 回复 发表于 2015-1-10 10:57
脚本的call :funx 的堆栈在 实模式堆栈 吧。 t.sh: 函数 :FUN有嵌套调用自己。 测试80多次调用后,就死机了。 感觉[/backcolor]好像 F6IMG嵌套 次数 大概这么多。  详情 回复 发表于 2015-1-9 22:19
回复

使用道具 举报

699#
发表于 2015-1-9 22:19:18 | 只看该作者
本帖最后由 mdyblog 于 2015-1-10 03:04 编辑
不点 发表于 2015-1-9 21:14
grub4dos 在解决内存冲突方面,作了多次的努力。最早的努力,是 gandalf 发现 grub4dos 总是莫名其妙地死机 ...



你说的是grub自己的嵌套调用。
脚本也有个嵌套调用的问题。同样造成堆栈溢出。
脚本的call :funx
的堆栈在 实模式堆栈 吧。


从前面可知, 每次会在堆栈上建立一个数组:
char cmdline_buf[1500];



tststack.sh:

  1. !BAT
  2. if "%~1"=="" debug 0
  3. set i=1
  4. call :FUN
  5. goto :eof

  6. :FUN
  7. set /a i=%i%+1
  8. echo -e -n \r    i=%i%                 \r
  9. set /a i0=%i% % 10
  10. if %i0%==0 pause --wait=1
  11. call :FUN
复制代码


函数 :FUN有嵌套调用自己。

测试89多次调用后,就死机了。

实测 F6IMG call :find_oem 嵌套 39次 。

不过, 89次应该够了。
F6IMG 应该改改,不要用嵌套调用。改为goto :


回复

使用道具 举报

700#
发表于 2015-1-10 10:55:00 | 只看该作者
chenall 发表于 2015-1-9 18:06
新上传的版本,解决debug 3的问题.

上面的问题可以上F6IMG的作者调试跟踪一下看看,必竟作者本人对这些代 ...

看了源代码, 猜测你们的意思。
cmd_buffer += (arg_len + 0x10) & -0x10;
似乎应该为:
cmd_buffer += (arg_len + 0x0F) & ~0x0F;
2者的结果是不同。

点评

>>chenall: 这个是要16字节对齐 发表于 25 分钟前 应该为: cmd_buffer += (arg_len + 0x0F) & ~0x0F; 不是 //cmd_buffer += (arg_len + 0x10) & -0x10; 后面这个有问题。 假设 arg_len=2 (arg_len  详情 回复 发表于 2015-1-10 11:55
这个是要16字节对齐  发表于 2015-1-10 11:19
回复

使用道具 举报

701#
发表于 2015-1-10 10:57:40 | 只看该作者
不点 发表于 2015-1-9 21:14
grub4dos 在解决内存冲突方面,作了多次的努力。最早的努力,是 gandalf 发现 grub4dos 总是莫名其妙地死机 ...

看了最新的源码。
现在用的是一个64K的全局数组——构成一个栈cmd_buffer,来保存cmdline_buf。
这样 89次死机,差不多对上来。

点评

记得之前有限制运行命令时使用栈空间的,超过64K之后就不执行命令的,并给出一个提示,这样就不会死机. 后来可能修改的时候改没了...没注意到,汗.  详情 回复 发表于 2015-1-10 11:29
回复

使用道具 举报

702#
发表于 2015-1-10 11:24:16 | 只看该作者
本帖最后由 chenall 于 2015-1-10 11:25 编辑

我今天测试了一下,没有发现死机(用今天上传的版本).用QEMU测试的虚拟了一个SCSI驱动.可以正常生成驱动盘.

实机因为电脑比较老,不需要SRS驱动,没有办法测试..

新上传的版本,修改了批处理调试方法

以前的debug 3功能取消了.
改成直接用debug执行的方法
比如
debug /f6img

为了方便调试允许跳过某一行(不执行),或者执行到下一个函数(CALL)开始处,具体的自己试一下就知道了,比以前的调试方便了一些.

只是不能在批处理内部开关调试功能.
回复

使用道具 举报

703#
发表于 2015-1-10 11:29:15 | 只看该作者
mdyblog 发表于 2015-1-10 10:57
看了最新的源码。
现在用的是一个64K的全局数组——构成一个栈cmd_buffer,来保存cmdline_buf。
这样 8 ...

记得之前有限制运行命令时使用栈空间的,超过64K之后就不执行命令的,并给出一个提示,这样就不会死机.

后来可能修改的时候改没了...没注意到,汗.
回复

使用道具 举报

704#
发表于 2015-1-10 11:32:57 | 只看该作者
看了代码好像也没有什么问题,看起来不像是栈空间的问题.
里面的call :aline执行完了就回收,而且使用的是goto :dyn_oem,没有嵌套调用呀.

  1. ::动态生成txtsetup.oem文件实现免按F6键
  2. :dyn_oem
  3. call Fn.13 %p% "\n" || exit
  4. call Fn.0 0 "%s" %@retval% | set aline =
  5. call :aline %1 %scsi% %aline% && set p=0
  6. goto :dyn_oem
  7. :aline
  8. if not "%~3"=="" set tmp=%~3 || exit
复制代码


可以用新版的调试一下,看看循环输出的内容是否有区别.

点评

>>可以用新版的调试一下,看看循环输出的内容是否有区别. 0109版测了。 没看出 循环输出的内容有什么区别。  详情 回复 发表于 2015-1-10 11:44
是的 :dyn_oem,没有嵌套,里面是个循环。 嵌套是 call :find_oem 嵌套了 39次 。 这个不是问题。 ------------------ 还是,从1206版本上,从头再来吧。 嵌入式的问题,一般是看不出来的,很多不是  详情 回复 发表于 2015-1-10 11:40
回复

使用道具 举报

705#
发表于 2015-1-10 11:34:04 | 只看该作者
本帖最后由 mdyblog 于 2015-1-11 10:11 编辑
chenall 发表于 2015-1-9 18:06
新上传的版本,解决debug 3的问题.

上面的问题可以上F6IMG的作者调试跟踪一下看看,必竟作者本人对这些代 ...



run_line  函数优化了下,call  :abc 时不占用宝贵的64K的命令行栈。
下面 红色为添加的代码。

int run_line (char *heap,int flags)
{
   char *cmdline_buf = cmd_buffer;
   char *arg;
   int status = 0;
   int ret = 0;
   int arg_len = 0;
   while (*heap == 0x20 || *heap == '\t')  ++heap;
   do
   {
      if(!grub_memcmp("call", heap,4) && (*heap[4] == 0x20 || heap[4] == '\t'))
      {
          //arg=heap+5;  //--其实这3行可以不要,直接break
          //while (*arg == 0x20 || *arg == '\t') ++arg;  //--
          //if(':'==*arg) //--
             break;
      }

      arg_len = strlen(heap) + 1;   
      cmd_buffer += (arg_len + 0x0F) & ~0x0F; //cmd_buffer += (arg_len + 0x10) & -0x10;
      memmove(cmdline_buf,heap,arg_len);
      heap = cmdline_buf;
   }while(0);

   while(*heap && (arg = heap))
   {
      heap = skip_to_next_cmd(heap,&status,OPT_MULTI_CMD_AND | OPT_MULTI_CMD_OR | OPT_MULTI_CMD);//next cmd
      ret = run_cmd_line(arg,flags);
      if (((status & OPT_MULTI_CMD_AND) && !ret) || ((status & OPT_MULTI_CMD_OR) && ret))
      {
         errnum = ERR_NONE;
         heap = skip_to_next_cmd(heap,&status,OPT_MULTI_CMD);//next cmd
      }
   }
   cmd_buffer = cmdline_buf;
   return ret;
}


运行次数还是有不太大的限制。
另外的地方每次会好用好大一块“堆”。
最终会因为“堆”耗尽而终止。
除非那儿再优化下: bat_run_script()函数。

回复

使用道具 举报

706#
发表于 2015-1-10 11:40:10 | 只看该作者
chenall 发表于 2015-1-10 11:32
看了代码好像也没有什么问题,看起来不像是栈空间的问题.
里面的call :aline执行完了就回收,而且使用的是go ...

是的  :dyn_oem,没有嵌套,里面是个循环。


嵌套是 call :find_oem
嵌套了 39次 。


这个不是问题。
------------------
还是,从1206版本上,从头再来吧。

嵌入式的问题,一般是看不出来的,很多不是逻辑问题,为是环境问题。
改点,再试试。
找个SATA的机器试试。
用我前面的测试包——我费劲整出个 测试包 ,就是让你开发中 能方便地反复测试。
回复

使用道具 举报

707#
发表于 2015-1-10 11:44:33 | 只看该作者
chenall 发表于 2015-1-10 11:32
看了代码好像也没有什么问题,看起来不像是栈空间的问题.
里面的call :aline执行完了就回收,而且使用的是go ...

>>可以用新版的调试一下,看看循环输出的内容是否有区别.
0109版测了。

没看出 循环输出的内容有什么区别。
回复

使用道具 举报

708#
发表于 2015-1-10 11:46:39 | 只看该作者
估计还是和编译器还有环境有关,就像之前的那个速度很慢的问题一样.

改动本来不应该影响这些的,但是就是有问题.....


回复

使用道具 举报

709#
发表于 2015-1-10 11:55:15 | 只看该作者
本帖最后由 mdyblog 于 2015-1-10 12:03 编辑
mdyblog 发表于 2015-1-10 10:55
看了源代码, 猜测你们的意思。
cmd_buffer += (arg_len + 0x10) & -0x10;
似乎应该为:


>>chenall:  这个是要16字节对齐  发表于 25 分钟前
cmd_buffer += (arg_len + 0x0F) & ~0x0F;
cmd_buffer += (arg_len + 0x10) & -0x10;
结果差不多, 就是 arg 本就对齐的时候,会在多占16字节.

后面这个有问题。
假设 arg_len=0x10
(arg_len + 0x10) & -0x10
= (0x10 + 0x10) & -0x10
=  0x20  & -0x10
=  0x20  & 0xFFFFFFF0   //假设为int32
= 0x20                       //结果显然不是上面想要的:16的 16字节对齐

再验证前面的算法:
(arg_len + 0x0F) & ~0x0F
=  (0x10 + 0x0F) & ~0x0F
=  0x1F & ~0x0F
=  0x1F & ~0xFFFFFFF0     //假设为int32
=  0x10    //这是要的:16的 16字节对齐

点评

~0x0f 和 -0x10是一样的 前面+0x10可以改成+0xf这样会节省一些空间,之前为了尽量保证不冲突. 用+0xf和+0x10的区别, 用0x10的话如果长度刚好是16字节对齐的话会额外占用16字节空间.用0xf就不会.  详情 回复 发表于 2015-1-10 12:02
回复

使用道具 举报

710#
发表于 2015-1-10 12:02:17 | 只看该作者
mdyblog 发表于 2015-1-10 11:55
>>chenall:  这个是要16字节对齐  发表于 25 分钟前
应该为:
cmd_buffer += (arg_len + 0x0F) & ~ ...

~0x0f 和 -0x10是一样的

前面+0x10可以改成+0xf这样会节省一些空间,之前为了尽量保证不冲突.

用+0xf和+0x10的区别,
用0x10的话如果长度刚好是16字节对齐的话会额外占用16字节空间.用0xf就不会.

点评

是的 -0x10 = ~0xF 就是 , 有时会多占16字节。  详情 回复 发表于 2015-1-10 12:05
回复

使用道具 举报

711#
发表于 2015-1-10 12:05:07 | 只看该作者
chenall 发表于 2015-1-10 12:02
~0x0f 和 -0x10是一样的

前面+0x10可以改成+0xf这样会节省一些空间,之前为了尽量保证不冲突.

是的 -0x10 = ~0xF

就是 , 有时会多占16字节。
回复

使用道具 举报

712#
发表于 2015-1-10 12:13:22 | 只看该作者
chenall 发表于 2015-1-9 18:06
新上传的版本,解决debug 3的问题.

上面的问题可以上F6IMG的作者调试跟踪一下看看,必竟作者本人对这些代 ...

grub4dos-0.4.5c-2015-01-10.7z

测试还是一样的。
看不出有什么区别。

点评

你的SATA驱动ID是多少?我看看能不能模拟测试下.  详情 回复 发表于 2015-1-10 12:53
回复

使用道具 举报

713#
发表于 2015-1-10 12:53:17 | 只看该作者
mdyblog 发表于 2015-1-10 12:13
grub4dos-0.4.5c-2015-01-10.7z

测试还是一样的。

你的SATA驱动ID是多少?我看看能不能模拟测试下.

点评

抓到的信息: WHID=PCI\VEN_8086&DEV_1C03&SUBSYS_05061025&CC_010601&REV_04 SRSID=PCI\VEN_8086&DEV_1C03 srs=(2)/  详情 回复 发表于 2015-1-10 13:12
回复

使用道具 举报

714#
发表于 2015-1-10 13:12:01 | 只看该作者

-

本帖最后由 mdyblog 于 2015-1-10 13:13 编辑
chenall 发表于 2015-1-10 12:53
你的SATA驱动ID是多少?我看看能不能模拟测试下.


抓到的信息:
WHID=PCI\VEN_8086&DEV_1C03&SUBSYS_05061025&CC_010601&REV_04
SRSID=PCI\VEN_8086&DEV_1C03
srs=(2)/



-----------------
另外, 0110版,下面这样单步调试,根本没有单步效果,一下子跑完了。
debug 3
command /F6IMG

点评

您可能没有注意看更新说明,还有前面的贴子 新版已经取消了debug 3功能. 改成直接debug了 debug /F6IMG 另外新版的刚发现一个错误,调试的时候'E'功能无效,因为之前的是用O的没改过来,下次再改了.  详情 回复 发表于 2015-1-10 13:48
回复

使用道具 举报

715#
发表于 2015-1-10 13:48:02 | 只看该作者
mdyblog 发表于 2015-1-10 13:12
抓到的信息:
WHID=PCI\VEN_8086&DEV_1C03&SUBSYS_05061025&CC_010601&REV_04
SRSID=PCI\VEN_8086&DE ...

您可能没有注意看更新说明,还有前面的贴子

新版已经取消了debug 3功能.

改成直接debug了

debug /F6IMG

另外新版的刚发现一个错误,调试的时候'E'功能无效,因为之前的是用O的没改过来,下次再改了.

点评

哦, 这样啊。 发现了。 [attachimg]206636[/attachimg] 能不能加个B功能,设置断点。 +数字, 就是相对偏移行数处设断点。 数字, 就是对应行号处设断点。  详情 回复 发表于 2015-1-10 14:03
回复

使用道具 举报

716#
发表于 2015-1-10 14:03:03 | 只看该作者
本帖最后由 mdyblog 于 2015-1-10 14:45 编辑
chenall 发表于 2015-1-10 13:48
您可能没有注意看更新说明,还有前面的贴子

新版已经取消了debug 3功能.


哦, 这样啊。
发现了。

能不能加个B功能,设置断点。
+/-数字, 就是相对偏移行数处设断点。
数字, 就是对应行号处设断点。

点评

我现在还不太清楚这个断点的用法,,你能不能给详细解释一下? 以前动态调试WINDOWS程序的时候,经常看到断点,但我不是很理解(因为我自己设置的总是无效,所以都是直接网上的代码).  详情 回复 发表于 2015-1-10 14:10
回复

使用道具 举报

717#
发表于 2015-1-10 14:10:11 | 只看该作者
mdyblog 发表于 2015-1-10 14:03
哦, 这样啊。
发现了。

我现在还不太清楚这个断点的用法,,你能不能给详细解释一下?

以前动态调试WINDOWS程序的时候,经常看到断点,但我不是很理解(因为我自己设置的总是无效,所以都是直接网上的代码).

点评

现对偏移可绝对行号是可以相互转换的。 假设设定的是绝对行号。 程序记住行号。 放开运行(E)时, 每次获得一行,检查当前行号是否在 断点列表中。 不是的话,直接运行。 是的话,进入交互模式, 输出调  详情 回复 发表于 2015-1-10 14:24
回复

使用道具 举报

718#
发表于 2015-1-10 14:24:57 | 只看该作者
本帖最后由 mdyblog 于 2015-1-10 14:44 编辑
chenall 发表于 2015-1-10 14:10
我现在还不太清楚这个断点的用法,,你能不能给详细解释一下?

以前动态调试WINDOWS程序的时候,经常看到 ...


1:
》》我现在还不太清楚这个断点的用法,,你能不能给详细解释一下?

B
15
后, 放开运行(就是E/o吧,或Run,或Continue)
一直接着正常运行, 如果运行到第15行,进入交互模式, 输出调试行,等待用户输入。
//对Continue是接着正常运行, 对Run是从头开始正常运行。
//这是后面输入的命令决定的, 和断点本身无关。
//断点只在运行时才会起作用: 每次 运行一行 前 都会检查断点信息。
如果第15行始终运行到就结束了,(goto掉了),可能直接运行完了,不会再提示DEBUG行。


对应地,还有清除断点。
D后列出断点

输入:N
清除第N个

//下面可以考虑
B也可以删除,乒乓的,如果该行断点,就去掉改断点。



2:

相对偏移可绝对行号是可以相互转换的。

假设设定的是绝对行号(1~N)。
程序记住行号。

放开运行(E)时, 每次获得一行,检查当前行号是否在 断点列表中。
不是的话,直接运行。
是的话,进入交互模式, 输出调试行,等待用户输入。


点评

程序内部的行号可和批处理的行号不是对应的..(会忽略空行和注释行还有标号行都不算在内)  详情 回复 发表于 2015-1-10 14:46
回复

使用道具 举报

719#
发表于 2015-1-10 14:46:41 | 只看该作者
本帖最后由 chenall 于 2015-1-10 14:48 编辑
mdyblog 发表于 2015-1-10 14:24
1:
》》我现在还不太清楚这个断点的用法,,你能不能给详细解释一下?


批处理运行时会预处理,先扫描一次整个批处理,然后完全在内存中运行,不是运行一行读一行的.

程序内部的行号可和批处理的行号不是对应的..(会忽略空行和注释行还有标号行都不算在内)

点评

这个自己想办法了。 比如,发现是调试模式, 不压缩空行,而是保留一个0x0a 或者其它辅助信息。  详情 回复 发表于 2015-1-10 14:52
回复

使用道具 举报

720#
发表于 2015-1-10 14:52:34 | 只看该作者
本帖最后由 mdyblog 于 2015-1-10 14:56 编辑
chenall 发表于 2015-1-10 14:46
批处理运行时会预处理,先扫描一次整个批处理,然后完全在内存中运行,不是运行一行读一行的.

程序内部 ...


这个自己想办法了。
比如,(发现是调试模式,)    不压缩 非代码行,而是保留一个0x0a
或者保留辅助调试信息库(dbg库——如gdb)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-6-1 22:38

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表