
正文
vb.net堆栈 堆栈bp
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
vb.net怎么打印执行代码行数
如何在VB.net中的应用程序运行打印行数
[英] how to print out line number during application run in VB.net
查看:341 发布时间:2015/11/25 16:05:39 .net vb.net debugging stack-trace line-numbers
万维广告联盟
🔐 杜绝删库跑路。一个平台登录所有资产,实现事先防范、事中控制、事后溯源,满足等保合规要求。
广告
本文介绍了如何在VB.net中的应用程序运行打印行数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想打印出我的调试消息,在VB.net应用程序的行号。 我不喜欢这样,
Dim st As StackTrace
Dim sf As StackFramee
st = New StackTrace(New StackFrame(True))
sf = st.GetFrame(0)
Console.WriteLine.("Line " sf.GetFileLineNumber())
我想把片段的一类,每次我打电话logMsg方法来记录我的消息,行号源$ C $ C。 但我发现,如果我把上面的代码段为一类,行数总是相同的,这是我新的'圣'。行
的功能是完全一样的具有_ 行的宏C ++。其实我是C ++程序员。
反正来解决这个问题?谢谢。
推荐答案
您已经证明是工作完全按预期的code。它打印在您拍摄的堆栈帧行的数目。因为你已经在不同的类中定义它,它打印包含类文件的行号。
在的getFrame 方法,在这里是非常重要的。栈帧起始编号是0,这是的最后的堆栈帧推。因此,参考帧0,则指示打印的最后的堆栈被推帧的行数的运行时间。当一个方法调用另一个,一个新的堆栈帧创建。
相反,你需要改变你的方法在几个重要方面。首先,你需要获得的第一个的框架被压入堆栈。第二,你可能要接受有关您回应异常含参数的信息。尝试重写你的调试方法看起来是这样的:
Public Sub PrintCurrentLine(ByVal ex As Exception)
Dim st As StackTrace = New StackTrace(ex)
Dim sf As StackFrame = st.GetFrame(st.FrameCount - 1)
Console.WriteLine("Line " sf.GetFileLineNumber())
End Sub
还要记住,如果你正在运行的code与优化启用,像行号可能已经改变。你总是需要包括PDB文件与您的code,它包含调试用于在这样的情况的信息。它映射优化code回到原来的来源。
这篇关于如何在VB.net中的应用程序运行打印行数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
相关问答
Q1: VB.NET做的程序在其它机器上运行时出现问题,求助!
缺少运行库
装上.NETframework
和带上引用的插件(工程属性那有个引用页)
吧
.
Q2: VB.NET中,PInvoke 函数 GetWindowThreadProcessId 调用导致堆栈不对称
题主用的是 VB6 时代的 Windows API,那里面的 Long 类型相当于 .NET 里的 Int32,声明 API 时要把所有 Long 类型替换成 Int32 才可以正常使用,否则堆栈溢出。
另外操作内存这种函数需要管理员权限来运行,否则程序会报错甚至崩溃。
Q3: 求大神修改 vb.net SetWaitableTimer(mlTimer, ft, 0, 0, 0, 0) 导致堆栈不对称 怎么修改?
Imports System.Runtime.InteropServices
Module APIs
StructLayout(LayoutKind.Sequential)
Public Structure FILETIME
Public dwLowDateTime As UInteger
Public dwHighDateTime As UInteger
Public ReadOnly Property Value() As ULong
Get
Return CType(dwHighDateTime 32, ULong) + dwLowDateTime
End Get
End Property
End Structure
Public Delegate Sub TimerCompleteDelegate()
DllImport("kernel32.dll")
Public Function CreateWaitableTimer(lpTimerAttributes As IntPtr, bManualReset As Boolean, lpTimerName As String) As IntPtr
End Function
DllImport("kernel32.dll")
Public Function SetWaitableTimer(hTimer As IntPtr, ByRef ft As Long, lPeriod As Int32, pfnCompletionRoutine As TimerCompleteDelegate, pArgToCompletionRoutine As IntPtr, fResume As Boolean) As Boolean
End Function
Public Function SetWaitableTimer(hTimer As IntPtr, ByRef ft As Long, lPeriod As Int32) As Boolean
Return SetWaitableTimer(hTimer, ft, lPeriod, Nothing, IntPtr.Zero, True)
End Function
End Module
SetWaitableTimer的声明错了
Q4: VB.net的默认堆栈有多大?如何修改默认堆栈大小
默认堆栈大小1 MB
具体vb.net堆栈的我也不了解vb.net堆栈,在MSDN上找了到了点东西看看对你有没帮助:
建立新线程指定并线程的最大堆栈大小:
用EDITBIN的/STACK选项:
不行还是在C++那里想办法吧,比如减少堆栈的使用,少用递归之类的。
水平不够就说这些了。
Q5: 在vb模块中怎么定义动态数组?
1、声明数组的语句:
Dim types( ) As integer
2、然后使用ReDim语句来配置数组大小。
ReDim Types(X+1)
3、假设想改变数组大小又不想丢失原来的数据,仅仅要在ReDim语句中包括Preservekeyword就能够,典型语句为:
ReDa_m PresetVe Types(10,23)
对于多维数组,在使用Preservekeyword时,仅仅能改动最后一维的大小。假设改变其它维,那么将出现执行错误。假设不清楚某维的当前大小,能够使用GetI~ength函数来获取。
扩展资料:
数组的使用:
用For Each来循环遍历一个数组。比如:
Dim x As Integer
F0r Each x In arrayl
Console.WriteLine(x)
Next
在使用数组时还要注意,不仅声明语法有变化,并且在执行时处理方式也有了非常大的变化。VB.NET在堆栈中给数组分配地址空间,当向一个方法传递数组类型的参数时,使用的是引用传递而不是值传递。以下是互相传递数组引用的三个方法:
Dim arrayl(3,3)AS Integer
Dim array2 As Integer(,)
Redim array2(3,3)
Dim array3 As Integer(,)={{2,4},{12,29}}
vb.net堆栈的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于堆栈bp、vb.net堆栈的信息别忘了在本站进行查找喔。








