简体   繁体   中英

Can't break in global.asax / Application_Start

I got a break point on the first line of Application_Start() , but Visual Studio wont break on it.

Visual Studio have attached itself to the IIS working process:

Auto-attach to process '[2092] w3wp.exe' on machine 'SRD00510' succeeded.

My breakpoint in the home controller do work.

update

I've tried:

  • iisreset
  • restarted visual studio
  • Rebooted.
  • Tried to reinstall aspnet ( aspnet_regiis -i )

Reading your question, I assume you are using IIS for debugging, not Visual Studio Development Server.

In this case, debugging application start is tricky, because it is only called once when the application pool is started or recycled. When Visual Studio attaches to the process, Application_Start has already been running.

The trick is to make the application pool recycle without killing the process you are attached to.

Do the following:

  1. In Visual Studio (must be run as Administrator) set your breakpoint in global.asax.cs and start debugging as usual (F5). The page opens in your web browser, but the breakpoint isn't hit.
  2. Now the trick: With a text editor, open web.config from where it is served by IIS, change it (eg enter a blank line somewhere) and save it. In contrast to recycling the application pool in IIS, this lets the application pool recycle (and thus running through Application_Start in global.asax.cs the next time the web site is called) without killing the process you are attached to.
  3. In your web browser, reload the page. The breakpoint should be hit now!

That works for me (IIS 7.5, VS2015).

Place this line in your Application_Start().

Debugger.Break();

This will present you with a dialog which will allow you to select a debugger. You might need to restart the application pool.

Application_Start() only runs once, when the application starts. A few things that restart the application are:

  • web.config changes
  • recycling the worker process - you can do this in IIS Manager or by running iisreset at the command line.

My solution is to switch to using the 'Visual Studio Development Server' to deal with the application class (Global.asax) issues. When done I switch back to IIS.

I assume you're loading the application by clicking the "debug" button in Visual Studio? That's what I'm doing (in VS 2012) and seeing similar problems. Pressing that button the first time starts the application and correctly hits the breakpoint. But it seems like after I stop debugging the application itself keeps going. So, future attempts to debug just attach to the existing process.
There's a "restart" button next to the "stop debugging" button, so I'd assume clicking that at least would change things. The debugging app does not show up in IIS manager, so I can't stop it there. Likewise, iisreset doesn't catch it either.

Only thing I've figured out so far is to change a line of code, thereby forcing visual studio to trigger a build and then it kills the existing proc and starts over. Kind of annoying if I just want to step through there multiple times.

I don't consider this a suitable "answer", but it might be a helpful workaround for you until somebody does come in with a real answer.

I've got around this problem before by doing this:

  1. Run a clean on my solution (Right click the solution node and click clean)
  2. Close solution
  3. File -> Exit on visual studio
  4. If you have multiple instances of visual studio running then exit out of all instances. Ensure "devenv.exe" is not listed in the processes in task manager
  5. Delete the user options file (.suo), usually in the same directory as your solution (.sln) file
  6. Recycle IIS worker process or if using the development server, kill that process

Now open your solution and give it a shot. (keep your fingers crossed :))

Whenever you run an application for the first time, or say start an application, there is an ASP.Net Development Server - Port [port number] that starts,

Application_Start() runs once in the course of an application.

If you want the break point to be reached , you have to stop the ASP.Net Development Server Port and run your application again.

如果 [2092] w3wp.exe 是您制作的服务,请尝试以下操作:停止服务 -> 重建服务项目 -> 启动重建服务 -> 尝试调试

If using IISEXPRESS is not an option, as @David Perlman mentions, I would go for a Logger. Log4Net or NLog are both good. It's good to have a logger in the longrun, for instance in production environments.

namespace DataService
{
    using NLog;
    public class Global : System.Web.HttpApplication
    {
        private Logger log; 
        protected void Application_Start(object sender, EventArgs e)
        {
            LogManager.LoadConfiguration("nlog.config");
            log = LogManager.GetCurrentClassLogger(); 
            log.Error($"Read this line in the log specified in nlog.config");
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM