如何使Java编译器在编译的代码中生成行号

时间:2017-04-12 18:00:27

标签: java javac

我有一个名为 A.class 的hello world程序。它是使用命令nextLine()编译的。它只需打印" hello world"

接下来,我使用javac A.java编译。我期待看到行号,但无法看到。知道发生了什么事吗?

我确实看到javac编译的.class文件和javac -g编译的.class文件之间的某些特殊字符存在细微差别。但我看不到任何行号。

我对此的好奇是因为我想找出行数对性能有何影响。其次,我想知道log4j等如何维护日志记录的行号。感谢。

1 个答案:

答案 0 :(得分:4)

编译命令很好,class CCitiesTable : public CTable<CAccessor<CCitiesTableAccessor> > { public: bool SelectAll(CCitiesArray& oCitiesArray) { CDataSource oDataSource; CSession oSession; CCitiesTable oCitiesTable; try { HRESULT hResult = CoInitialize(0); if (FAILED(hResult)) { //Message( _T("Unable to CoInitialize COM Interface.") ); return FALSE; } CDBPropSet oDBPropSet(DBPROPSET_DBINIT); oDBPropSet.AddProperty(DBPROP_INIT_DATASOURCE, _T("LENOVO2\\SQL2008") ); // сървър oDBPropSet.AddProperty(DBPROP_AUTH_USERID, _T("sa") ); oDBPropSet.AddProperty(DBPROP_AUTH_PASSWORD, _T("massive") ); oDBPropSet.AddProperty(DBPROP_INIT_CATALOG, _T("PhoneBookDB" )); oDBPropSet.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false); oDBPropSet.AddProperty(DBPROP_INIT_LCID, 1033L); oDBPropSet.AddProperty(DBPROP_INIT_PROMPT, static_cast<short>(4)); // Свързваме се към базата данни hResult = oDataSource.Open(_T("SQLOLEDB.1"), &oDBPropSet); if (FAILED(hResult)) { //Message(_T("Unable to connect to SQL Server database. Error: %d"), hResult); return FALSE; } //Open session hResult = oSession.Open(oDataSource); if (FAILED(hResult)) { //Message(_T("Unable to open session. Error: %d"), hResult); oDataSource.Close(); return FALSE; } //Make query CString strQuery; strQuery = _T("SELECT * FROM dbo.CITIES"); // Execute query hResult = oCitiesTable.Open(oSession, strQuery); 确实会生成调试信息。顺便说一句:默认情况下会生成行号,需要-g或类似名称才能将其关闭。

缺少的是一种有意义地检查生成的-g:none文件的方法,类似于工具使用它的方式。尝试:

.class

$ javap -l -c A.class 打开行号表的打印。 -l打开反汇编的字节码指令的打印(可能很有趣,因为行号表将源行号与字节码指令相关联)。